前提:
操作系统是centos6.5,编译的内核版本为2.6.32.61,编译linux内核过程详见本博客http://blog.csdn.net/supenman_mwg/article/details/25836547
1、修改内核文件unistd_32.h
cd /home/linux-2.6.32.61/ arch/x86/include/asm
vim unistd_32.h
要添加的内容如下所示,注意相应的位置。最好按照系统调用号的从小到大的顺序来放。
#define __NR_mwg_hello 337
修改完了之后,保存退出。
这里是我自己添加的代码,大家可以把mwg_hello换成任意字符;
下面是我自己修改代码的截图
:
2、修改内核文件syscall_table_32.S
cd /home/linux-2.6.32.61/ arch/x86/kernel
vim syscall_table_32.S
在文件的末尾添加
.long sys_mwg_hello
sys_后面的字符要和unistd_32.h中__NR_后面的字符相对应,我这里都是mwg_hello
下面是我修改文件的截图
3、修改内核文件sys_i386_32.c
cd /home/linux-2.6.32.61/ arch/x86/kernel
vim sys_i386_32.c
在文件的末尾添加系统调用函数
asmlinkage long sys_mwg_hello(void)
{
printk("mwg's first system call!\n");
return 0x5211314;
}
4、编译内核文件syscalls.h
在syscalls.h文件中添加声明
asmlinkage long sys_mwg_hello(void);
5、编译内核
修改完文件之后,编译内核并安装 详见http://blog.csdn.net/supenman_mwg/article/details/25836547
6、编写用户空间程序进行测试
我写的测试文件如下:
#include <stdio.h>
#include <sys/syscall.h>
#include <linux/unistd.h>
#define __NR_mwg_hello 337
int main()
{
int loveNum;
loveNum=syscall(__NR_mwg_hello);
printf("Love num is %x\n",loveNum);
return 0;
}
编译并运行
gcc -o mwg_hello mwg_hello.c
sudo ./mwg_hello
测试结果
Love num is 5211314
在终端下输入命令
dmesg //dmesg打印内核消息
显示结果如图