在Linux内核中添加系统调用,并编译内核

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来慢慢喝了,为什么是一桶?因为时间真的很长~~~

   

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。