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

来源:互联网 发布:c socket传输json 编辑:程序博客网 时间:2024/05/01 03:32
实验环境: 
虚拟机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<stdio.h> int main() {  syscall(337,1);//337是第五步中宏定义的入口参数,1为函数的参数,整型变量number  return 0; } 
编译,运行。在终端输入dmesg -c可显示函数的输出内容:这是***编写的的系统调用函数。 
0 0
原创粉丝点击