添加一个简单的系统调用
1 谈加系统调用号:
系统调用号是在inistd.h中定义的。内核中每个系统调用号都以 __NR_开头。
在arch/86/include/asm/unistd_32.h
- 341 #define __NR_preadv 333
- 342 #define __NR_pwritev 334
- 343 #define __NR_rt_tgsigqueueinfo 335
- 344 #define __NR_perf_event_open 336
- 345 #define __NR_recvmmsg 337
- 346 #define __NR_mysyscall 338 <<<<<<此处为添加的系统调用
- 347
- 348 #ifdef __KERNEL__
- 349
- 350 #define NR_syscalls 339 <<<<<< 这里一定要记着改
/usr/include/asm/unistd_32.h
- 341 #define __NR_preadv 333
- 342 #define __NR_pwritev 334
- 343 #define __NR_rt_tgsigqueueinfo 335
- 344 #define __NR_perf_event_open 336
- 345 #define __NR_recvmmsg 337
- 346 #define __NR_mysyscall 338
添加系统调用号以后,系统才能把这个号作为索引去查找系统调用表 sys_call_table 中的对应项。
2。在系统调用表中添加相应的表项
arch/x86/kernel/syscall_table_32.S
- 1 ENTRY(sys_call_table)
- 2 .long sys_restart_syscall3 /* 0 - old "setup()" system call, used for r estarting */
- ...
- 338 .long sys_perf_event_open
- 339 .long sys_recvmmsg
- 340 .long sys_mysyscall /*338*/
3。实现系统调用服务例程
- asmlinkage int sys_mysyscall(int x)
- {
- printk(“hello this is my syscall\n”);
- printk(“%d\n”,x);
- }
asmlinkage 是gcc中的一个特殊标志。gcc 常用的一种编译优化方法是使用寄存器传递函数的参数,而加了 asmlinkage 修饰符的函数必须从堆栈中而不是寄存器中获取参数。
4。重新编译内核
5。编写用户程序测试
- #include<stdio.h>
- main()
- {
- syscall(338,1);
- }
阅读(1580) | 评论(4) | 转发(1) |