深入分析fork的执行过程(Linux-0.11内核)

        在上一篇文章中简单分析了fork、pause等系统调用的实现,怀着对fork在父子进程中返回不同值的好奇,本文中将深入分析fork的执行过程以及如何实现在父子进程中返回不一样的值(父进程---子进程ID,子进程----0)。

        为了分析fork,可以从它定义处开始一步一步的分析它执行的过程以及堆栈内容的变化。下面从syscall0(int,fork)展开后的结果:

static inline int fork(void)
{
	long __res;
	__asm__ volatile ("int $0x80" \     //调用系统中断0x80
	: "=a" (__res) \  					//__res用来承载中断返回值
	: "0" (__NR_fork)); \				//输入为系统中断调用号__NR_fork ( = 2)
if (__res >= 0) \
	return (int) __res; \			//如果返回值>=0,则直接返回该值。
errno = -__res; \				//否则置出错号
return -1; \					//并返回-1
}

       从上面第2行代码可知,fork执行过程的起点为“int $0x80” ,通过调用系统中断0x80从而跳转到_system_call中去执行。返回值__res从eax寄存器中得到,当__res >= 0时返回__res值,否则报错并返回-1 。在调用系统中断0x80时,CPU保存现场,自动把一些寄存器的值按顺序压入栈,此时栈内的内容如下图所示,把ss、esp、eflags、cs寄存器入栈,在调用system_call函数时把返回程序的入口地址也入栈。

         接下来,程序跳转进入/kernel/system_call.S文件中system_call系统调用入口函数_system_call处执行。

.align 2
reschedule:
	pushl $ret_from_sys_call
	jmp _schedule
.align 2
_system_ca
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值