Linux内核分析第四周作业

实验截图

代码分析

fork.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

void main()
{
    printf("Hello World !");
    fork();//生成一个与主进程一模一样的子进程,并返回子进程的pid。
}

fork-asm.c
#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>

void main()
{
    int pid;
    printf("Hello World!");
    asm volatile(
    "mov $0x2,%%eax\n\t"    //fork的系统调用号是2号,将它放入eax寄存器中。
    "int $0x80\n\t"       //通过此句指令,调用存在于eax寄存器中的2,执行2号系统调用即fork。
    "mov %%eax,%0\n\t"    //执行fork系统调用完成后会返回子进程pid到eax中,此句将子进程pid返回到内存中。
    :"=m"(pid)
    );
}

总结

高级编程语言在API中封装了系统调用,比如C语言中就将2号系统调用封装在fork函数中。执行系统调用时,Linux现将系统调用号存入eax寄存器中,在执行int $0x80指令来执行该系统调用,执行完后返回的值存于eax寄存器中,再将其返回内存。



Sawoom原创作品转载请注明出处
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容