Chinaunix首页 | 论坛 | 博客
  • 博客访问: 178195
  • 博文数量: 30
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 440
  • 用 户 组: 普通用户
  • 注册时间: 2008-07-23 19:45
文章分类

全部博文(30)

文章存档

2016年(2)

2010年(3)

2009年(8)

2008年(17)

我的朋友

分类: 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过程中系统由用户模式切换到内核模式,同时堆栈也切换到内核堆栈。看看这个时候堆栈发生了什么变化,如下图:

此时系统堆栈保存了系统调用号,用户空间csEFLAGS,用户空间esp和用户空间的ss的值。当程序转入到标准C库后,调用getpid(),执行int 0x80,这是一条软中断指令,执行这条指令后从中断描述符表(idt)中,找到相应的函数入口地址,这个地址指向函数sys_call( ),那么这个地址是何时被写入到idt中的呢?当系统初始化时,函数trqp_init( )执行,在它里面调用了set_system_gate(SYSCALL_VECTOR,&system_call),其中SYSTEM_VECTOR就是0x80,这个函数的作用就是将函数system_call的地址写到idt0x80位置处,这样执行int 0x80后,就可以跳转到函数system_call中去了。下来我们就进入到了system_call函数中了,这个函数再调用内核例程sys_getuid16(void)。这样整个调用结束,在依次返回。

阅读(1577) | 评论(1) | 转发(0) |
0

上一篇:等待队列(一)

下一篇:内存寻址

给主人留下些什么吧!~~

chinaunix网友2008-09-08 22:01:54

图没有显示。这样的分析简练,但抓到了本质。