`

向内核添加系统调用——玩转Linux(三)

 
阅读更多

环境:ubuntu11.04

工具:vim

内核源码:linux-2.6.38.8

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

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

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

修改:在最后面添加

asmlinkageintsys_foo(intx)

{

printk("thenunberis:%d!\n",x);

returnx;

}

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


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

修改:在最后面添加

.longsys_XXX

所以我这里就添加.longsys_foo


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

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

修改前:

#define__NR_fanotify_init338

#define__NR_fanotify_mark339

#define__NR_prlimit64340

#ifdef__KERNEL__

#defineNR_syscalls341

#define__ARCH_WANT_IPC_PARSE_VERSION

#define__ARCH_WANT_OLD_READDIR

#define__ARCH_WANT_OLD_STAT

修改后:

#define__NR_fanotify_init338

#define__NR_fanotify_mark339

#define__NR_prlimit64340

#define__NR_foo341

#ifdef__KERNEL__

#defineNR_syscalls342

#define__ARCH_WANT_IPC_PARSE_VERSION

#define__ARCH_WANT_OLD_READDIR

#define__ARCH_WANT_OLD_STAT

注意了,那个号是在#defineNR_syscalls342之前,#define__NR_prlimit64340之后的


步骤二:编译并安装内核

详细步骤请看:http://blog.csdn.net/xuyuanfan77/article/details/7088854


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

#include<linux/unistd.h>

#include<stdio.h>

intmain(){

printf("Thenumberis%d\n",syscall(341,100));

return0;

}

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


步骤四:验证的时刻到了

第一个验证:

linuxer@ubuntu:~/Desktop$./foo

Thenumberis100

第二个验证:

linuxer@ubuntu:~/Desktop$dmesg

[1963.829598]thenunberis:100!



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics