使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
沙雨济 20122137
原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一 、实验内容:
参考视频中的方式使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用
二 、实验过程:(附截图)
本例中使用getpid函数,getpid 函数用来取得目前进程的进程ID ,许多程序利用取到的此值来建立临时文件 ,以避免临时文件相同带来的问题。
进入实验楼环境,根据视频中的方式编写main.c。
#include
#include
int main(void){
pid_t pid;
pid=getpid();
printf("Process id:%d\n", pid);
return 0;
}
然后编译运行。
接着编写嵌入汇编代码的程序。
#include
#include
int main() {
pid_t pid;
asm volatile (
"mov $0,%%ebx\n\t"
"mov $0x14,%%eax\n\t"
"int $0x80\n\t"
"mov %%eax,%0 \n\t"
: "=m" (pid)
);
printf("process id:%d\n", pid);
return 0;
}
编译运行。
三 、实验总结:
通过本节的学习,我对系统调用有了更深入的了解,知道了系统调用的三层皮:xyz( API )、system_call( 中断向量 )和 sys_xyz( 服务程序 )。系统调用通过中断的方式在内核态和用户态之间切换。由汇编代码可以看出,系统调用 通过eax准备系统调用号,使用ebx等寄存器传递具体参数,当我们触发0x80中断时,经过中断处理程序,便进入了内核态。