linux内核编程增加系统调用,如何在Linux 2.6.27.45内核上添加新的系统调用

选摘资料:

1.cd /usr/src/linux/include/asm-generic/

2. vim unistd.h,添加#define __NR_mysyscall  337

3.cd /usr/src/linux/arch/x86/kernel/

4. vim syscall_table_32.S 添加.long sys_mysyscall

5.cd /usr/src/linux/kernel

6.vim sys.c 添加函数

asmlinkage int sys_mysyscall(void)

{

printk( "hello, world" );

return 10;

}

7.编译,并且启用新内核

8.编写代码

#include

#include

#define __NR_mysyscall  337

int main(int argc, char** argv)

{

syscall(__NR_mysyscall );

return 0;

}

============================================================

步骤_1   添加源代码

编写添加到内核中的源程序,函数名以sys_开头。

如:mycall(int num),在/usr/src/linux/kernel/sys.c文件中添加如下代码:

asmlinkage int sys_mycall(int number)

{

return number;   //该系统调用仅返回一个整型值

}

步骤_2   连接新的系统调用

使内核的其余部分知道该系统调用的存在。为此,需编辑两个文件:

/usr/src/linux/include/asm-i386/unistd.h——系统调用清单(为每个系统调用分配唯一号码)

#define _NR_name nnn

这里,name:系统调用名;nnn:系统调用对应的号码,不能与内核自身的系统调用号相同。

/usr/src/linux/arch/i386/kernel/entry.S——对sys_call_table[ ]进行初始化(增加新的内核函数的指针)

.long SYMBOL_NAME(sys_mycall)

步骤_3   重建Linux内核

以root身份进入/usr/src/linux目录,重建内核

#make config       //基于文本的传统配置界面

#make dep     //检验内核源代码文件的依赖性和完整性

#make clean    //清除以前编译的目标文件

#make bzImage //编译内核,也可采用make zImage

编译生成的内核文件为

/usr/src/linux/arch/i386/boot/bzImage

配置内核的方式

make config              基于文本的传统配置界面

make menuconfig    基于文本的菜单形式配置界面,字符终端下使用

make xconfig            基于图形窗口模式的配置界面,Xwindow下使用

对每个配置选项,有三种选择:

“Y”——将该功能编译进内核

“N”——不将该功能编译进内核

“M”——将该功能编译成可动态载入的内核模块

步骤_4   重启内核

将/usr/src/linux/arch/i386/boot/bzImage拷贝到/boot/bzImage

配置启动文件

若采用lilo,修改/etc/lilo.conf,添加新的引导内核

image=/boot/bzImage       // 上面编译生成的内核映象

label=Linuxtest                 // 给该系统取个名字

root=/dev/hda5                 // 根目录所在的分区,可用命令df查看

read-only

若采用grub,修改/etc/grub.conf,添加新的引导内核

title Linuxtest

root(hd0,4)

kernel /boot/bzImage ro root=/dev/hda5

initrd /boot/initrd-2.4.18-3.img

重启后,出现Linuxtest选项,选择它进入新的内核

步骤_5   使用新的系统调用

#include

#include

include/asm/unistd.h>

#include

_syscall1(int, mycall, int, ret)

int main(int argv, char *argc[])

{   int a = mycall(100);

printf(“%d\n”,a);

return 0;

}

下面是我的亲身经历,实测,最终成功的生成了bzImage文件,可以引导:

修改的文件有:

1。/usr/src/linux/kernel/sys.c

添加:

asmlinkage int sys_mycall(int number)

{

return number;   //该系统调用仅返回一个整型值

}

2。/usr/src/linux/include/asm-x86/unistd_32.h

添加#define _NR_name nnn

貌似修改asm-x86和asm文件夹下面的都一样,最终都会修改到上面的unistd_32.h文件。

还有,也不存在修改总数的操作,直接添加一个你的那个号就可以了。

3。/usr/src/linux/arch/x86/kernel/syscall_table_32.S

添加 .long sys_mysyscall

应该是:.long SYSMBOL_NAME(sys_mysyscall)吧?

特别注意,前后的名称要一致。

4。make menuconfig

具体的参数不需要改变,只需要保存下,生成一个config文件就可以了,便于后面的bzImage的创建。

一切成功,OK。

附记:发现VBOX有一个BUG,如果长期不用的话,内外的剪切板不能共享,即,内部copy的数据,在外部不能使用。

而如果注销后,重新启动,就可以了。。上面的一段就是从虚拟机中导出来的,成功了。。

posted on 2010-03-03 23:48 deercoder 阅读(1426) 评论(1)  编辑 收藏 引用 所属分类: Unix/Linux

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值