fork和pause等系统调用的实现原理(Linux0.11内核)

这篇博客深入探讨了Linux0.11内核中fork和pause系统调用的实现过程。从应用程序调用API到系统调用宏的执行,再到int 0x80中断触发,详细阐述了fork如何通过系统调用中断门与system_call函数关联,并在中断返回后进行错误检查。此外,还提到了pause系统调用的相关内容。
摘要由CSDN通过智能技术生成

系统调用大致过程是:
    1.应用程序调用API函数库(例如:libc)中的接口函数。

    2.接口函数引用相应的系统调用宏。

    3.系统调用宏中使用int 0x80完成系统调用并返回到应用程序。


本文主要针对在Linux0.11内核源码中,fork和pause系统调用的实现过程。

a.在main.c文件的开头有如下的系统调用宏:

static inline _syscall0(int,fork)
static inline _syscall0(int,pause)
  其中,_syscall0宏的定义如下所示,

#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \
	: "=a" (__res) \
	: "0" (__NR_##name)); \
if (__res >= 0) \
	return (type) __res; \
errno = -__res; \
return -1; \
}
   _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
}

   此处的fork函数的实现内容为 : 系统调用中断号存入eax寄存器,然后调用系统中断0x80,得到中断返回值,判断返回值,大于0则直接返回,否则设置出错号并返回-1。其中的系统调用中断号在include/unistd.h文件中定义,fork的中断号为2:

#define __NR_setup	0	/* used only by
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值