前几天刚学习编译了linux内核2.6.33.1,比较大,所以花费了很多时间,于是就后悔之前没有写几个系统
调用放在里面(毕竟编译一次内核需要花费很长的时间)今天又试着添加了一个简单的系统调用,作用
很简单,就是就是借鉴阿龙前段时间写的一个内核模块,调用sched.h里面的一个宏
for_each_process()来实现当前系统中所有的进程的遍历,然后打印到系统日志当中。
好了,这里就说明下我的添加步骤:
一、在系统函数表中添加表项:
是在目录/usr/src/linux-2.6.33.1/arch/x86/kernel下
zhou@zhou:/usr/src/linux-2.6.33.1/arch/x86/kernel$ sudo vim syscall_table_32.S
在这个文件中的最后一行添加自己的系统调用表项(红色为自己添加的)
.long sys_rt_tgsigqueueinfo /* 335 */
.long sys_perf_event_open
.long sys_recvmmsg
.long sys_sayhello
OK,表项算是添加完了,然后添加系统调用号
二、添加自己的系统调用号
在目录/usr/src/linux-2.6.33.1/arch/x86/include/asm/下
zhou@zhou:/usr/src/linux-2.6.33.1/arch/x86/include/asm$ sudo vim unistd_32.h
在这个文件的大概346行的位置后添加(红色为自己添加的)
#define __NR_perf_event_open 336
#define __NR_recvmmsg 337
#define __NR_syahello 338
OK,系统调用号也添加上了,这里有一点提醒大家,系统调用号和表项中是相对应的也就是表项中的
行相应的一项(在我的例子中两个都是338),现在,万事具备,只欠东风
三、完成自己的系统调用函数
这个函数书写的位置理论上是任意的,但是有高手指点我,最好写在kernel文件夹下,原因不明。我就
在这里面看到一个顺眼的,既是sys.c
命令既是
zhou@zhou:~$ sudo vim /usr/src/linux-2.6.33.1/kernel/sys.c
在这个里面添加一段代码,作为自己的系统调用函数,我的如下:
/*在头文件中添加下面*/
#include
/*代码如下*/
/*
* this is my first syscall_function
*
*/
asmlinkage void sys_sayhello(void)
{
struct task_struct *task;
task = &init_task;
printk(KERN_INFO "call sys_sayhello\n");
for_each_process(task) {
printk( KERN_ALERT "%d\t%s\n", task->pid, task->comm );
}
}
好了,实现的功能前面也已经说明,然后就是重新编译内核,如果之前没有编译过内核,那就参考我的
这篇文章,如果已经编译过了,但是因为这次改动的幅度较大,所以编译的时间也会很长,如果只是改 动代码内容,基本没有修改相应头文件内容,那编译的时间将会很短。这些也是我编译了很多遍的经验
了,呵呵,赞一个。
不瞎扯了,编译完成后呢,就是安装一下即可,make install(如果使第一次编译内核,参考这篇文章)
之前写这篇文章的时候忘记添加一个调用自己写的系统调用的实例了,在这篇文章中有一个简单的调用实例, 还有带参数和返回值的系统调用的例子。
OK,基本就这些了,有什么问题留言讨论,也可以发邮件给我zhouyongfei1988@gmail.com