1,“学习linux最好的方法就是试着修改她”,下面就用一个小例子,说一下,如何添加一个linux的系统调用。
2,步骤:
1》向官方申请分配给咱一个系统调用号,假设为300,咱们的系统调用名称叫long sys_rill(void)
2》在系统调用的表项(一般在对应体系结构的entry.s中)最后添加一行:
.long sys_rill
3》定义系统调用号(一般在<asm/unistd.h>中):
#define _NR_rill 300
4》实现系统调用:
系统调用不能实现为模块,必须添加的主线内核,所以一般放在kernel目录下的某个文件中:
asmlingage long sys_rill(void)
{
printk("hello my system call\n");
return 1;
}
5》用户空间调用新加的系统调用:比如test.c
#define __NR_rill 300
__syscall0(long,rill)
int main()
{
long ret = 0;
ret =rill();
return 0;
}
3,虽然添加一个系统调用步骤比较简单,但是强烈建议不要添加。可以通过另外一种方式替代:写一个模块,创建一个设备节点,然后通过ioctl() 随便折腾。
当然获得一个官方的系统调用号的机会几乎为零,呵呵。