Linux操作系统调用执行过程<转>
来源:互联网 发布:漳州seo 编辑:程序博客网 时间:2024/06/18 04:20
层次如下:
用户程序------>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函数,然后执行相应的服务例程。但是由于是代表用户进程,所以这个执行过程并不属于中断上下文,而是进程上下文。因此,系统调用执行过程中,可以访问用户进程的许多信息,可以被其他进程抢占,可以休眠。
当系统调用完成后,把控制权交回到发起调用的用户进程前,内核会有一次调度。如果发现有优先级更高的进程或当前进程的时间片用完,那么会选择优先级更高的进程或重新选择进程执行。
- Linux操作系统调用执行过程<转>
- linux 系统调用执行过程
- linux 系统调用执行过程
- linux 系统调用执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux操作系统中/sbin/init程序的执行过程
- Linux系统调用------追踪系统调用的执行过程
- 系统调用执行过程
- 操作系统动态库调用过程
- Linux操作系统开发过程
- linux操作系统初始化过程
- Linux操作系统启动过程
- Android的日志
- H - Climbing Worm解题报告(陈渊)
- 第九周实验一
- 第九周实验报告(三)
- 一旦需要使用共用pid,请把使用pid部分独立开来
- Linux操作系统调用执行过程<转>
- 使用spring的特殊bean --- 分散配置
- JS中window.showModalDialog()详解
- ubifs文件系统的制作过程&&遇到的问题及解决方案总结---之一“uboot中添加对UBIFS文件系统的支持”
- 将Quartus波形图导入至matlab的方法
- 数据挖掘书籍
- Courses
- 第九周任务一
- 暗时间-不是书评 :《我是一只IT小小鸟》