您的位置:首页 > 编程语言

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

2017-03-19 19:09 316 查看
 王宣 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

第一部分:回顾

       系统调用的意义:

                           操作系统为用户态进程与硬件设备进行交互提供了一组接口--------系统调用

                                       1.把用户从底层的硬件编程中解放出来

                                       2.极大的提高了系统的安全性

                                       3.使用户程序具有可移植行

         API和系统接口:

               
应用编程接口(即API)和系统调用不同

                              1.API只是一个函数定义

                              2.系统调用通过软中断向内核发出一个明确的请求

                    Libc库定义的一些API引用了封装例程(wrapper routine,唯一目的就是发布系统调用)

                              1.一般每个系统调用对应一个封装例程

                              2.库再用这些封装例程定义出给用户的API

                   关于返回值

                              1.大部分封装例程会返回一个整数,其中值的含义依赖于相应的系统调用

                              2.大多数情况下,-1表示内核不能满足进程的请求

                              3.Libc中定义的errno变量包含特定的出错码

                    需要注意的地方:并不是每个API都对应一个特定的系统调用,有可能直接提供用户态的服务

                                            一个单独的API也可能调用几个系统调用,而且不同的API也可能调用同一个系统调用

第二部分: API,system_call和sys_xyz

            回顾中已经说明了,API中封装了系统调用;system_call则是运行于内核态,从名字上也能大概猜出来,它是

            所有系统调用在内核态的入口点,而sys_xyz则是执行具体的系统调用操作,完成系统调用请求

            


          上图中的xyz()在用户态,int 0x80触发系统调用,然后进入system_call,然后通过sys_xyz()执行具体的调用操作

第三部分:实验部分

这里采用的是fork(),首先是c语言的格式



这里是汇编形式



结果,就截了一幅图



第四部分:总结

每次课程都有不少的收获,也要感觉老师的通俗讲解,希望自己能坚持下去。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐