向Linux内核添加系统调用函数

向Linux内核添加系统调用函数
向Linux内核添加系统调用函数

向Linux内核添加系统调用函数

实验环境:

虚拟机VMware 6.0

操作系统Ubuntu9.10(内核版本2.6.31-14-generic)

修改内核版本2.6.31.12

实验步骤:

1.下载Linux内核:在终端中输入命令sudo apt-get install linux-source,下载的文件在/usr/src 目录下。(注:如果源没有更新的,在下载之前请先更新源。)

2.将内核代码解压缩:例如下载的内核文件为linux-source-2.6.31.tar.bz2,运行解压命令tar –jxvf linux-source-2.6.31.tar.bz2。解压出的文件夹为/usr/src/linux-source-2.6.31。

3.修改/usr/src/linux-source-2.6.31/kernel/sys.c文件,例如在文件末尾增加一个系统响应函数。asmlinkage int sys_mycall(int number)

{

printk("这是***编写的的系统调用函数");//printk是内核中日志级别的输出函数

return number;

}

4.在/usr/src/linux-source-2.6.31/arch/x86/kernel/syscall_table_32.S中添加:.long sys_mycall。

5.在/usr/src/linux-2.

6.31/arch/x86/include/asm/unistd_32.h中添加:#define __NR_mycall 序号(例如337),添加系统调用的入口参数(注意:其中会顺序定义入口参数的序号,添加的序号是在原有最大值的基础上+1)

6.编译内核:

首先切换到解压的内核目录下。

第一步:make mrproper 清除内核中不稳定的目标文件,附属文件及内核配置文件

第二步:make clean 清除以前生成的目标文件和其他文件

第三步:make oldconfig 采用默认的内核配置

第四步:make bzImage 编译内核

第五步:make modules 编译模块

第六步:make modules_install 安装模块

总共需要的编译的时间大约为两个小时。

7.编译完成后,设置采用新内核启动。

例如我们编译成功的内核版本号为2.6.31.12。

运行命令:

cp /usr/src/linux-source-2.6.31/arch/i386/boot/bzImage /boot/vmlinuz-2.6.31.12(注意:2.6.31.12为你编译的内核版本。)

mkinitramfs -o initrd.img-2.6.31.12 2.6.31.12

cp /usr/src/linux-source-2.6.31/ initrd.img-2.6.31.12 /boot/ initrd.img-2.6.31.12

8. 增加引导菜单项,配置启动项文件/boot/grub/grub.cfg。(旧版本可能对应于文件menu.lst。) 可以看到文件中结构

menuentry "Ubuntu, Linux 2.6.31-14-generic"{

……

}

menuentry "Ubuntu, Linux 2.6.31-14-generic (recovery mode)"{

……

}

复制一份并修改为:

menuentry “Ubuntu, kernel 2.6.31.12”{

……

}

menuentry “Ubuntu, kernel 2.6.31.12 (recovery mode)”{

……

}

再分别对两个括号内的两处进行修改,改为:

linux /boot/vmlinuz-2.6.31.12

initrd /boot/initrd.img-2.6.31.12

完成后执行终端命令sudo update-grub2,之后重启,终端输入uname -a检查你的内核版本是否是你编译的版本2.6.31.12。

9.编写测试函数

#include

int main()

{

syscall(337,1);//337是第五步中宏定义的入口参数,1为函数的参数,整型变量number return 0;

}

编译,运行。在终端输入dmesg -c可显示函数的输出内容:这是***编写的的系统调用函数。

相关文档
最新文档