Linux添加系统调用

本文基于Linux 2.4.26内核,GCC 3.2.2添加系统调用mycall(int num)

增加系统调用只修改/usr/src/linux-2.4.29/include/asm-i386/unistd.h和arch/i386/kernel/entry.S,系统调用函数一般在kernel/sys.c中,这里把增加的系统调用代码也加入这个文件中。

1.修改kernel/sys.c文件,加入自己的系统调用代码,同参考文献(见文后地址)中,

asmlinkage int sys_mycalll(int num)

{

printk("This is added by yan/n");

return num;

}

往内核输出一句话,然后返回参数值。asmlinkage表示通过堆栈递参数。

2.然后把sys_mycall(int )的入口地址添加到sys_call_table表中。该表依次存储所有系统调用的入口地址。

修改前为:

.long SYMBOL_NAME(sys_ni_syscall)/* sys_set_tid_address这是第258个系统调用* /

.rept NR_syscalls-(.-sys_call_table)/4

.long SYMBOL_NAME(sys_ni_syscall)

修改后:

.long SYMBOL_NAME(sys_ni_syscall)/* sys_set_tid_address */

.long SYMBOL_NAME(sys_mycall)/*这是增加的第259个系统调用*/

.rept NR_syscalls-(.-sys_call_table)/4-1 /*这里重复次数减少1*/

.long SYMBOL_NAME(sys_ni_syscall)

3.把增加的sys_call_table表项所对应的向量,在include/asm-i386/unistd.h中进行必要申明,以供用户进程和其他系统进程查询或调用:

#define __NR_exit_group252

#define __NR_mycall259/*这是增加的第259个系统调用*/

然后编译内核make bzImage,并用生成的新内核启动系统。

覆盖原有的内核 cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.26

cp System.map /boot/System.map-2.4.26

4.测试程序(test.c)如下:

然后执行命令

dmesg | tail

看到输出的内容

This is added by yan

你可能感兴趣的:(linux)