系统调用大致过程是:
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