系统调用实验——以fork函数为例,用API和C语言嵌入汇编两种

2019-07-16  本文已影响0人  程序爱好者

                                                        

一、实验目的

深入理解系统调用的工作机制

二、实验内容

1、实验平台:实验楼Linux虚拟机环境下完成实验

2、实验内容:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,这里我们使用fork()函数,其系统调用号为2.

交流群728483370,一起学习加油!  

三、实验步骤

1、fork()函数的C语言代码

#include 

#include 

#include 

int main ()

{

pid_t fpid;

 int count=0;

fpid=fork();

if (fpid < 0)

printf("error in fork!");

else if (fpid == 0)

{

printf("I am the child process, my process id is %d\n",getpid());

count++;

}

else

{

printf("I am the parent process, my process id is %d\n",getpid());

count++;

}

printf("Result is: %d\n",count);

return 0;

}

2、fork()函数的汇编语言代码

3、进入实验楼环境,运行上述c代码和嵌入式汇编代码,其实验结果如下图

4、调试

输入以下命令开始调试

$gcc -m32 -g -o fork_call fork_call.c  

$gdb fork_call -tui -q  

接着先查看源代码

(gdb)layout src  

设置断点

(gdb)break main  

查看寄存器

(gdb)layout regs  

逐条运行

(gdb)si  

这里提一下:si的运行取决于layout所看的视图是汇编视图还是源代码视图,汇编视图逐汇编语句运行,源代码视图逐源代码语句运行。调试截图:

5、关键代码分析

在上述代码中,首先将ebx设置成0,然后将eax设置成2(前面提到过fork()函数的系统调用号为2),这样就可以通过syscall_32.tbl进行调用fork()函数运行。然后返回eax返回函数值0xf4b,于是便完成了调度。不过,在将eax设置成2后,有一个段代码:int 0x80。这个的意思是产生中断,这样我们便可以从用户态转换为内核态,从而调用了系统的函数fork()。

五、 总结

系统是通过中断的方式将用户态转换为内核态,同时调用系统函数来实现系统功能。当系统中断出现时,CPU保护现场和上下文切换来保护目前用户态所运行的状态,并通过返回系统调用函数的值来让用户判断是否已经有效地调用,结果如何。如exit(),waitpid(),getpid(),fork(),sysinfo()等等。这些方式就是系统级应用程序接口对用户系统编程提供的帮助,使用户更好地管理内核。交流群728483370,一起学习加油!  

上一篇 下一篇

猜你喜欢

热点阅读