博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核学习第五周 系统调用
阅读量:6717 次
发布时间:2019-06-25

本文共 1128 字,大约阅读时间需要 3 分钟。

一、实验截图

二、系统调用流程图:
 
 
 
三、总结:系统调用过程分析
      linux
的系统调用过程:用户程序→C
库(即
API
):
INT 0x80 →system_call→系统调用服务例程→内核程序。我们常说的用户
API
其实就是系统提供的
C
库。

  系统调用是通过软中断指令 INT 0x80 实现的,而这条INT 0x80指令就被封装在C库的函数中。软中断和我们常说的硬中断不同之处在于,软中断是由指令触发的,而不是由硬件外设引起的。INT 0x80 这条指令的执行会让系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即system_call函数。系统调用处理程序system_call 并不是系统调用服务例程,系统调用服务例程是对一个具体的系统调用的内核实现函数,而系统调用处理程序是在执行系统调用服务例程之前的一个引导过程,是针对INT 0x80这条指令,面向所有的系统调用的。简单来讲,执行任何系统调用,都是先通过调用C库中的函数,这个函数里面就会有软中断 INT 0x80 语句,然后转到执行系统调用处理程序 system_call system_call 再根据具体的系统调用号转到执行具体的系统调用服务例程。

system_call函数是怎么找到具体的系统调用服务例程的呢?通过系统调用号查找系统调用表sys_call_table.软中断指令INT 0x80执行时,系统调用号会被放入 eax 寄存器中,system_call函数可以读取eax寄存器获取,然后将其乘以4,生成偏移地址,然后以sys_call_table为基址,基址加上偏移地址,就可以得到具体的系统调用服务例程的地址了.

然后就到了系统调用服务例程了。需要说明的是,系统调用服务例程只会从堆栈里获取参数,所以在system_call执行前,会先将参数存放在寄存器中,system_call执行时会首先将这些寄存器压入堆栈。system_call退出后,用户可以从寄存器中获得(被修改过的)参数。

  需要指出的是,系统调用通过软中断INT 0x80陷入内核,跳转到系统调用处理程序system_call函数,然后执行相应的服务例程。但是由于是代表用户进程,所以这个执行过程并不属于中断上下文,而是进程上下文。因此,系统调用执行过程中,可以访问用户进程的许多信息,可以被其他进程抢占,可以休眠。

  当系统调用完成后,把控制权交回到发起调用的用户进程前,内核会有一次调度。如果发现有优先级更高的进程或当前进程的时间片用完,那么会选择优先级更高的进程或重新选择进程执行。

转载于:https://www.cnblogs.com/zmingh/p/5326694.html

你可能感兴趣的文章
.Net额外小工具
查看>>
【转】Eclipse的启动问题【an error has occurred see the log file】
查看>>
一款纯css3实现的条纹加载条
查看>>
ADF_Advanced ADF系列1_Fusion应用的客制和个性化(Part1)
查看>>
multipart/form-data和application/x-www-form-urlencoded的区别
查看>>
[LeetCode] Reorder List 链表重排序
查看>>
[总结]文件传输模型之文件中转
查看>>
jQuery(一)引入
查看>>
Facebook内部分享:26个高效工作的小技巧
查看>>
jstack和线程dump分析
查看>>
NETSH WINSOCK RESET这条命令的含义和作用?
查看>>
SQL批量更新数据库中所有用户数据表中字段类型为tinyint为int
查看>>
第一次使用Android Studio时你应该知道的一切配置(二):新建一个属于自己的工程并安装Genymotion模拟器...
查看>>
AtomicInteger简介
查看>>
(转)解决ScrollView嵌套ListView或者GridView导致只显示一行的方法
查看>>
html5 -- audio标签
查看>>
DNG格式解析
查看>>
Windows 下搭建LDAP服务器
查看>>
2015年第8本(英文第7本):the city of ember 微光城市
查看>>
FZU操作系统课程实验 实验一
查看>>