使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

 使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

 沙雨济 20122137

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

 

posted @ 2015-05-03 19:58  zumer  阅读(313)  评论(0编辑  收藏  举报