全部博文(18)
分类: LINUX
2009-04-03 11:29:42
syscalls:
连接硬件设备和应用程序
系统调用是用户空间访问内核的唯一手段;除异常和陷入,是内核唯一的合法入口。
C库或其他语言库封装了系统调用,应用程序只需要调用封装后的API。
通常通过函数进行调用,需要定义一个或多个输入参数,可能会使系统状态发生变化。
每个系统调用有独一无二的系统调用号。
系统调用表sys_call_table,在/boot/System.map中。
/boot/System.map:表项以32位(4字节)存放。
用户空间的参数通过寄存器传入内核,X86系统用ebx、ecx、edx、esi和edi存放前5个参数;给用户空间的返回值通过eax寄存器传送(x86中)。
系统调用注册过程:
(1) 编写系统调用。放入kernel/sys.c中,或者其他与之功能密切联系的代码中
(2) 注册入系统调用表entry.S
|
|
直接访问系统调用:_syscalln()宏
n=0~6,代表传递给系统调用的参数个数;
每个宏,都有2+2×n个参数;
第一个对应系统调用的返回值类型;
第二个对应系统调用名称;
后面的按照调用参数顺序排列每个参数的类型和名称。
例如:open()系统调用
C库支持:long open(const char *filename, int flags, int mode)
直接调用宏:
#define __NR_open 5
_syscall3(long, open, const char *, filename, int, flags, int, mode)