您的位置:首页 > 其它

系统调用过程

2017-07-20 14:31 288 查看
系统调用:

  每个系统调用都通过lib库体现。每一个系统调用在lib库中一般是一个宏syscallX(),X是具体某个调用的数字参数。

 有的系统调用更复杂,因为它们有可变 的参数列表,但它们仍用一样的入口指针。

  当syscall()被调用后,并没有任何的系统代码被执行,直到syscall()调用了int  0x80  ,中断0x80 把调用

(控制)传给核心入口地址中的_system_call(),这个入口地址对任何系统调用都是一样的。  _System_call()

 负责保护所有的寄存器,并检查系统调用是否合法,如果合法那么根据从_sys_call_table中

 找出的偏移量,把控制权转给真正的系统。 

  

  system_call函数详细过程:

   (当用户调用INT 0x80而进入system_call函数后,首先检查用来存放系统调用编号的eax的值是否超出IDT表的

  项数NR_syscalls(NR_syscalls是在“/include/linux/sys.h”文件中定义的宏,其值为256,表示80x86微机上

  最多可容纳的系统调用个数)。如没有超出的话,就根据eax的值从系统调用表(sys_call_table)中得到对

  应的系统调用入口,并通过call 指令转入各个具体函数(sys_*)的处理过程。)

  

     系统调用完成后,_system_call() 还要负责调用_ret_from_sys_call()来断后。_Ret_from_sys_call()检

 查是否有必要重新调度,如果有的话,调用他。

                        
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  系统调用 内核