Linux常用网络服务的使用与配置例析.ppt

* * * * 与普通函数类似,系统调用通常也需要输入/输出参数,这些参数可能是实际的值(例如数值),也可能是函数的地址及用户态进程地址空间的变量。因为system_call( )函数是Linux中所有系统调用唯一的人口点,因此每个系统调用至少有一个参数,即通过eax寄存器传递来的系统调用号。例如,如果一个应用程序调用fork( )封装例程,在执行int $0x80汇编指令之前就把eax寄存器置为5。因为这个寄存器的设置是由libc中的封装例程进行的,因此程序员通常并不需要关心系统调用号。 fork( )系统调用并不需要其他的参数。不过,很多系统调用确实需要由应用程序明确地传递另外的参数。例如,mmap( )系统调用可能需要多达6个参数(除了系统调用号)。 普通函数的参数传递是通过把参数值写进活动的程序栈(或者用户态栈或者内核态栈)。但是系统调用的参数通常是传递给系统调用处理程序在CPU中的寄存器,然后再拷贝到内核态堆栈。 为什么内核不直接把参数从用户态的栈拷贝到内核态的栈呢?首先,同时操作两个栈是比较复杂的;此外,寄存器的使用使得系统调用处理程序的结构与其他异常处理程序的结构类似。 然而,为了用寄存器传递参数,必须满足两个条件: (1)? 每个参数的长度不能超过寄存器的长度,即32位3。 (2)? 参数的个数不能超过6个(包括eax中传递的系统调用号),因

文档评论(0)

1亿VIP精品文档

相关文档