- 论坛徽章:
- 0
|
本帖最后由 feiyangczm 于 2011-04-18 15:07 编辑
一。Linux系统调用的几个要素:
1。系统调用门
系统调用接口基于软中断实现。在系统内核初始化过程中内核为系统调用设置了0x80的中断门。系统调用通过该中断门的安全检验然后切换到内核栈中。
2。内核态栈
在Linux系统中,一个用户进程包含一个用户态栈和一个内核态栈,用户态栈存储了用户进程运行在用户态时函数调用的参数,局部变量和其他辅助书记。内核态栈相应的也是保存在进程运行在内核态时函数调用的参数,局部变量和其他的数据。
3。系统调用号
内核为了能判断用户请求了哪个系统调用而定义了系统调用号(在src/include/asm/unistd.h中定义)。在将系统调用号作为system_call的参数从而实现系统调用。
4。系统调用表sys_call_table(在src/arch/i386/kernel/system_table.S中定义)
该表为系统调用号对应的定义了系统调用服务函数的入口地址。入口地址在构造内核镜像的过程中被确定。
二、创建一个系统调用
1。修改系统调用表
在src/arch/i386/kernel/system_table.S中的sys_call_table的最后添加一个系统调用sys_call_test。如:
.long sys_dup3 /* 330 */
.long sys_pipe2
.long sys_inotify_init1
.long sys_call_test /*333*/
相应的在src/include/asm-x86/unistd.h中增加对应的系统调用号
#define __NR_pipe2 331
#define __NR_inotify_init1 332
#define __NR_call_test 333
2。添加处理函数
为了方便我们就在src/kernel/time.c中添加该测试函数
asmlinkage long sys_call_test(void)
{
return 11;
}
这样就完成了系统调用的添加
3。测试
我们采用syscall()函数来实现该调用
#include "stdio.h"
。。。。
。。。
#define __NR_SYSCALL_TEST 333
int main(int argc,char **argv)
{
printf("system call test %d\n",syscall(__NR_SYSCALL_TEST));
return 1;
} |
|