详解Linux系统调用过程

Linux系统调用的层次如下:

    用户程序-------->C库(即API):INT 0x80------------>system_call------------>系统调用服务例程--------->内核程序

    ***API即就是系统提供的C库。系统调用是通过软中断指令INT 0x80实现的。

(1)INT 0x80:被封装在C库函数中,执行此指令会让新系统跳转到一个预设的内核空间地址,它指向系统调用处理程序,即system_call函数

(2)system_call:根据具体的系统调用号转到执行具体的系统调用服务例程。

        过程:通过系统调用号查找系统调用表sys_call_table,软中断指令0x80执行时,系统调用号会被放入eax寄存器当中(由于系统调用服务例程只会从堆栈中获取参数),system_call函数可以读取eax寄存器获取(system_call函数执行时会首先将这些寄存器压入堆栈中),然后将其乘以4,生成偏移地址,然后以sys_call_table为基址,基址加上偏移地址,就可以得到具体的系统调用服务例程的地址,然后就可以得到系统服务例程(是对一个具体的系统调用的内核实现函数,系统调用处理程序是在执行系统调用服务例程之前的一个引导过程,是针对INT 0x80这条指令的,面向所有系统调用)了。


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

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

二。系统调用的意义

系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层的作用:

1.为用户空间提供了一个统一的硬件的抽象接口。

2.保证了系统的稳定和安全(可以避免应用程序不正确的使用硬件设备,窃取其它进程的资源)

3.如果应用程序可以随意的访问硬件,而内核又对此一无所知的话,几乎无法实现多任务和虚拟内存,当然也不能实现良好的稳定性和安全性

在Linux中,系统调用时用户空间访问内核的唯一手段,除异常和中断外,他们是访问内核的唯一入口。






参考博客:http://blog.sina.com.cn/s/blog_9df3658301011b7f.html


猜你喜欢

转载自blog.csdn.net/m0_37962600/article/details/79943461