在看linux内核代码时,常会遇到诸如:static inline _syscall0(int,fork)这样的函数。经查阅资料,发现该函数是嵌入式汇编宏函数。
linux内核提供了7个非常有用的宏定义,依次是:_syscall0,_syscall1,_syscall2,_syscall3,_syscall4,_syscall5,_syscall6。它们分别用来封装不同数目参数的系统调用,最后的数字表示该宏定义访问需要几个参数的系统调用,如_syscall0用于访问不需要参数的系统调用;_syscall3用于访问需要三个参数的系统调用。
如_syscall0()函数的宏定义原型是:
#define _syscall0(type,name) \
type name(void) \
{ \
long __res; \
__asm__ volatile ("int $0x80" \ //调用系统中断0x80
:"=a" (__res) \
:"" (__NR_##name)); \ //输入为系统中伏安调用号 __NR_name
if (__res >=0) \ //如果返回值>=0,则直接返回该值
return (type) __res; \
errno=-__res;\
return -1;} //否则置出错号,并返回-1
__NR_##name是系统调用号,##指的是两次宏展开,即用实际的系统调用名字代替"name",然后再把__NR_...展开。如name==ioctl则为__NR_ioctl