系统调用过程

来源:互联网 发布:周鸿祎谈网络战争 编辑:程序博客网 时间:2024/06/03 16:54

系统调用:


  每个系统调用都通过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()检
 查是否有必要重新调度,如果有的话,调用他。
                        

原创粉丝点击