實驗截圖
代碼分析
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的系統(tǒng)調用號是2號,將它放入eax寄存器中。
"int $0x80\n\t" //通過此句指令,調用存在于eax寄存器中的2,執(zhí)行2號系統(tǒng)調用即fork。
"mov %%eax,%0\n\t" //執(zhí)行fork系統(tǒng)調用完成后會返回子進程pid到eax中,此句將子進程pid返回到內存中。
:"=m"(pid)
);
}
總結
高級編程語言在API中封裝了系統(tǒng)調用,比如C語言中就將2號系統(tǒng)調用封裝在fork函數中。執(zhí)行系統(tǒng)調用時,Linux現將系統(tǒng)調用號存入eax寄存器中,在執(zhí)行int $0x80指令來執(zhí)行該系統(tǒng)調用,執(zhí)行完后返回的值存于eax寄存器中,再將其返回內存。
Sawoom原創(chuàng)作品轉載請注明出處
《Linux內核分析》MOOC課程http://mooc.study.163.com/course/USTC-1000029000