分类: LINUX
2008-09-07 22:36:13
什么是系统调用以及系统调用有什么好处在这里就不多说了,随便找一本讲系统调用的书上面一开始都有介绍,我主要是想说说我系统调用的过程。
来看一个最简单的系统调用的例子吧:
#include
int main()
{
int i=getuid();
printf(“Hello World!This is my uid%d\n”,i);
return 0;
}
通过这个程序来说说整个过程。看下面的图:
在我们的用户程序中调用了getpid()这个系统调用,然后经历A过程转到标准C库,在A过程中系统由用户模式切换到内核模式,同时堆栈也切换到内核堆栈。看看这个时候堆栈发生了什么变化,如下图:
此时系统堆栈保存了系统调用号,用户空间cs,EFLAGS,用户空间esp和用户空间的ss的值。当程序转入到标准C库后,调用getpid(),执行int 0x80,这是一条软中断指令,执行这条指令后从中断描述符表(idt)中,找到相应的函数入口地址,这个地址指向函数sys_call( ),那么这个地址是何时被写入到idt中的呢?当系统初始化时,函数trqp_init( )执行,在它里面调用了set_system_gate(SYSCALL_VECTOR,&system_call),其中SYSTEM_VECTOR就是0x80,这个函数的作用就是将函数system_call的地址写到idt的0x80位置处,这样执行int 0x80后,就可以跳转到函数system_call中去了。下来我们就进入到了system_call函数中了,这个函数再调用内核例程sys_getuid16(void)。这样整个调用结束,在依次返回。