Chinaunix首页 | 论坛 | 博客
  • 博客访问: 822497
  • 博文数量: 92
  • 博客积分: 1498
  • 博客等级: 上尉
  • 技术积分: 993
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-18 18:31
文章分类

全部博文(92)

文章存档

2013年(2)

2012年(3)

2011年(3)

2010年(61)

2009年(23)

分类: LINUX

2010-05-11 18:43:33

前几天刚学习编译了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

阅读(3347) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-06 11:19:02

#define __NR_syahello 338 这里应该是 #define __NR_sayhello 338. 因为你后面调用的时候是 __NR_sayhello, 飞哥你可能是笔误啊! 哈哈!

chinaunix网友2010-10-05 19:17:38

“这个函数书写的位置理论上是任意的,但是有高手指点我,最好写在kernel文件夹下,原因不明。“ 写在kernel文件加下面,是因为系统调用必须编译道内核映像中去,一般把他放到与其功能联系最密切的代码中,假设他的功能与调度相关,那么你也可以把他放到sched.c.其实kernel/sys.c也是可以的。

dolinux2010-06-27 21:07:53

写的很详细,转载了。。。哈哈