1 环境准备
运行系统:vmware下安装的ubuntu10.10 32bit桌面版。
编译内核版本: linux-2.6.32.63
内核目录: /home/wanchouchou/linuxKernel/linux-2.6.32.63
为了方便,使用chmod 777 -R linux-2.6.32.63/ 将所有的内核文件都改为全权限,这样就可以在非root状态修改文件进行编译了。
2 添加系统调用
首先进入linux-2.6.32.63目录下。以后的文件路径都是以此目录为“根目录”的。
2.1 在系统函数表中添加表项
进入arch/x86/kernel目录下,然后vim syscall_table_32.S,在此文件的最后一行添加自己的系统调用表项:
1 .long sys_rt_tgsigqueueinfo /* 335 */ 2 .long sys_perf_event_open 3 .long sys_mycall //这是我们自己添加的表项
好了,下面开始添加系统调用号。
2.2 添加自己的系统调用号
现在进入目录 arch/x86/include/asm,该目录下有三个文件unistd_32.h, unistd_64.h, unistd.h。由于我们编译的是32位内核,所以需要在unistd_32.h中添加系统调用号。
vim unistd_32.h,在最后添加代码:
1 #define __NR_perf_event_open 336 2 #define __NR_syahello 337 //添加的 3 #ifdef __KERNEL__ 4 5 /* 原本为337,但是由于我们添加了一行,所以改338*/ 6 #define NR_syscalls 338
2.3 编写自己系统调用的实现函数
由于系统调用必须编译到核心的内核镜像中去。所以我们将此函数的实现写到kernel/sys_i386_32.c中:
1 //引入头文件 2 #include <asm/page.h> 3 ........ 4 //添加函数代码 5 asmlinkage long sys_mycall(void){ 6 return THREAD_SIZE; 7 }
3 编译内核
现在就可以回到linux-2.6.32.63目录进行编译了。如果以前编译过内核,最好使用make mrproper和make clear命令来清除之前的编译残留文件。如果是第一次编译内核,那么就需要对内核的编译选项进行配置,这里推荐使用make menuconfig。如果键入该命令后提示缺少ncurses库文件的话,就使用sudo apt-get install libncurses5-dev命令安装该库。之后就可以进行menuconfig配置了,建议保持默认值即可。
一切准备就绪,键入make命令开始编译内核!现在可以泡一桶coffee来慢慢喝了,为什么是一桶?因为时间真的很长~~~