感谢支持
我们一直在努力

向Linux内核添加系统调用

环境:Ubuntu 11.04


工具:vim


内核源码:linux-2.6.38.8


Linux向内核添加系统调用其实并不难,简单地来说就是修改内核源码中的一些文件,编译并安装内核,然后写个用户程序调用它验证验证就OK了~~


步骤一:修改3个内核源码文件


第一个文件:/usr/src/linux-2.6.38.8/kernel/sys.c


修改:在最后面添加


asmlinkage int sys_foo(int x)


{


        printk(“the nunber is : %d !\n”, x);


        return x;


}


这个函数就是要添加进内核的系统调用了,功能很简单,仅仅实现的是将传进来的参数打印出来并且返回,注意了,这里用的是printk,不是printf,printk可以说是内核版的printf吧,呵呵~~所以输出的信息不在终端上,而是在系统日志上,使用“dmesg”命令就可查看


第二个文件:/usr/src/linux-2.6.38.8/arch/x86/kernel/syscall_table_32.S


修改:在最后面添加


.long sys_XXX


所以我这里就添加.long sys_foo了


第三个文件:/usr/src/linux-2.6.38.8/arch/x86/include/asm/unistd_32.h


这个文件包含了系统调用号,所以要为我们自己添加的系统调用取一个号(num)放在里面,格式为:“#define __NR_XXX num”,这个号可不是乱取的,必须是紧接着该列表最后一项取值,比如我的:


修改前:


#define __NR_fanotify_init      338


#define __NR_fanotify_mark      339


#define __NR_prlimit64          340


#ifdef __KERNEL__


#define NR_syscalls 341


#define __ARCH_WANT_IPC_PARSE_VERSION


#define __ARCH_WANT_OLD_READDIR


#define __ARCH_WANT_OLD_STAT


修改后:


#define __NR_fanotify_init      338


#define __NR_fanotify_mark      339


#define __NR_prlimit64          340


#define __NR_foo 341


#ifdef __KERNEL__


#define NR_syscalls 342


#define __ARCH_WANT_IPC_PARSE_VERSION


#define __ARCH_WANT_OLD_READDIR


#define __ARCH_WANT_OLD_STAT


注意了,那个号是在#define NR_syscalls 342之前,#define __NR_prlimit64 340之后的


步骤二:编译并安装内核


详细步骤请看: http://www.linuxidc.com/Linux/2012-07/65310.htm


步骤三:写一个用户程序调用该系统调用


#include <linux/unistd.h>


#include <stdio.h>


int main(){


        printf(“The number is %d\n”,syscall(341,100));


return 0;


}


其中syscall的第一个参数“341”就是foo的系统调用号,第二个参数“100”是传进去的参数。接下来编译并运行之。


步骤四:验证的时刻到了


第一个验证:


www.linuxidc.com @ubuntu:~/Desktop$ ./foo


The number is 100


第二个验证:


www.linuxidc.com @ubuntu:~/Desktop$ dmesg


[ 1963.829598] the nunber is : 100 !

赞(0) 打赏
转载请注明出处:服务器评测 » 向Linux内核添加系统调用
分享到: 更多 (0)

听说打赏我的人,都进福布斯排行榜啦!

支付宝扫一扫打赏

微信扫一扫打赏