实验截图
代码分析
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