Linux系统调用探究(上)
Linux系统提供了一系列系统调用,用户可以通过这些系统调用与Linux内核进行交互,对于一个典型的C程序来说,调用一次系统调用经历了如下三层
1,2运行在用户态,3才真正进入内核态
以简单的getpid系统调用来说,典型做法就是调用POSIX接口getpid(),代码如下
#include <unistd.h>
#include <stdio.h>
int main()
{
int pid = getpid();
printf("pid: %d\n", pid);
return 0;
}
这个过程非常简单,但是有必要探究一下系统调用在用户态真正的执行流程,于是我们使用内联汇编来调用getpid系统调用,代码如下
#include <unistd.h>
#include <stdio.h>
int main()
{
int pid = 0;
__asm__ __volatile__ (
"mov $0, %%ebx\n\t"
"mov $0x14, %%eax\n\t"
"int $0x80\n\t"
"mov %%eax, %0\n\t"
: "=m" (pid)
);
printf("pid-asm: %d\n", pid);
return 0;
}
我们要关注的部分主要在于内联汇编部分
"mov $0, %%ebx\n\t"
"mov $0x14, %%eax\n\t"
"int $0x80\n\t"
"mov %%eax, %0\n\t"
: "=m" (pid)
最后一行声明了导入导出参数pid,不多说
第一行: mov $0, %%ebx
ebx用于传递系统调用的第一个参数,getpid不需要参数,所以这儿就是立即数0,相当于NULL 系统调用的传参规则如下:
第二行:mov $0x14, %%eax
触发软中断时,具体调用哪个系统调用是由系统调用号决定的,系统调用号需要储存在eax中,随后使用int $0x80触发中断
第三行:int $0x80
int 0x80触发中断,没啥说的
第四行:mov %%eax, %0
系统中断的返回值储存在eax中,这儿是将eax的值写进了pid变量的内存区域
这个过程也比较简单,但是已经阐明了系统调用在用户态的触发过程
运行结果如图
![实验截图](http://images.cnblogs.com/cnblogscom/current/613723/o7C%60YR(5QP53M18F07GYPU.jpg)
吴韬 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
原文:http://www.cnblogs.com/current/p/4382266.html