位置:51电子网 » 技术资料 » 嵌入式系统

Linux系统调用例程system_call和参数传递

发布时间:2009/2/18 0:00:00 访问次数:2179

  系统调用接口调用“int $ox8o”指令进入内核并准各了相关参数后,剩下的工作就由系统调用例程来进行。linux定义的系统调用 例程的入口为system_call。下面具体介绍system_call所做的工作。

  system_call是用汇编语言编写的,在i386体系中,其前半部分代码如下:

  这部分代码的任务是传递系统调用号和参数。

  前面谈到,为了识别具体的内核服务例程,必须用寄存器eax传递系统调用号。除此之外,某些内核服务例程还需要一些由用户提供 的参数。例如,内核服务例程mmap()除系统调用号之外还需要6个参数。

  传递参数的任务是由处理器的寄存器来完成的。

  在ijbo系统中,用来进行参数传递工作的寄存器依次为eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系统调用号的传递。 所以,在函数system_call中,一开始就使用宏save_all把处理器的各寄存器压栈,以便以后系统调用服务例程可从内核堆栈中根据 需要找到相关的参数。

  可见,为了传递参数,在系统调用接口中就应把所有参数按照规定事先存入各寄存器。至于参数多于6个的情况,可采用在内存中设 置一个参数缓冲区,而让处理器的寄存器作为指针指向的这个参数缓冲区的办法来解决。

  接下来,程序对进程传递的系统调用号进行有效性检查。如果无效,则系统调用中止:

  如果有效,则根据寄存器eax提供的系统调用号并通过syscall_table来调用对应的内核服务例程:call*sys_call_table(0,% eax,4)

  当服务例程结束时,system_call从eax获得返回值,然后跳转到返回函数ret_from_sys_call返回用户态:

  movl % eax,24(% esp)

  jmp ret_from_sys_call

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



  系统调用接口调用“int $ox8o”指令进入内核并准各了相关参数后,剩下的工作就由系统调用例程来进行。linux定义的系统调用 例程的入口为system_call。下面具体介绍system_call所做的工作。

  system_call是用汇编语言编写的,在i386体系中,其前半部分代码如下:

  这部分代码的任务是传递系统调用号和参数。

  前面谈到,为了识别具体的内核服务例程,必须用寄存器eax传递系统调用号。除此之外,某些内核服务例程还需要一些由用户提供 的参数。例如,内核服务例程mmap()除系统调用号之外还需要6个参数。

  传递参数的任务是由处理器的寄存器来完成的。

  在ijbo系统中,用来进行参数传递工作的寄存器依次为eax、ebx、ecx、edx、est和edi。其中,eax被指定用于系统调用号的传递。 所以,在函数system_call中,一开始就使用宏save_all把处理器的各寄存器压栈,以便以后系统调用服务例程可从内核堆栈中根据 需要找到相关的参数。

  可见,为了传递参数,在系统调用接口中就应把所有参数按照规定事先存入各寄存器。至于参数多于6个的情况,可采用在内存中设 置一个参数缓冲区,而让处理器的寄存器作为指针指向的这个参数缓冲区的办法来解决。

  接下来,程序对进程传递的系统调用号进行有效性检查。如果无效,则系统调用中止:

  如果有效,则根据寄存器eax提供的系统调用号并通过syscall_table来调用对应的内核服务例程:call*sys_call_table(0,% eax,4)

  当服务例程结束时,system_call从eax获得返回值,然后跳转到返回函数ret_from_sys_call返回用户态:

  movl % eax,24(% esp)

  jmp ret_from_sys_call

  欢迎转载,信息来自维库电子市场网(www.dzsc.com)



相关IC型号

热门点击

 

推荐技术资料

DFRobot—玩的就是
    如果说新车间的特点是“灵动”,FQPF12N60C那么... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!