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

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

作者: 程序爱好者 | 来源:发表于2019-07-16 16:59 被阅读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,一起学习加油!  

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/cybtlctx.html