环境:Ubuntu 14.04 64位
内核版本:3.13.0
下载Linux源码
安装必备软件
apt-get gcc make libncurses5-dev
下载源码
apt-get linux-source
下载后的源码在/usr/src下面
我的是/usr/src/linux-source-3.13.0/linux-source-3.13.0.tar.bz2
解压:
tar jxvf linux-source-3.13.0.tar.bz2
arch/x86/syscall/syscall_64.tbl
添加318 common mysyscall sys_mysyscall
include/uapi/asm-generic/unistd.h
添加#define __NR_mysyscall 278 __SYSCALL(__NR_mysyscall, sys_mysyscall)
修改
#undef __NR_syscalls #define __NR_syscalls 279
kernel/sys.c
添加SYSCALL_DEFINE0(mysyscall) { printk("mysyscall test\n") ; return 0 ; }
编译内核
修改保存,开始编译,基本编译步骤:
make menuconfig # 生成配置文件
make bzImage
make modules
make modules_install
make install
修改grub文件,启动时选择新生成的内核
GRUB_DEFAULT=1
GRUB_HIDDEN_TIMEOUT=5
修改完保存,执行update-grub
启动时按ESC键,选择新的内核
测试
测试代码
#include <unistd.h>
#include <sys/syscall.h>
#include <errno.h>
#include <stdio.h>
int main(void)
{
syscall(318) ;
printf("errno = %d\n", errno) ;
return 0;
}
编译
gcc -o test test.c
执行
./test
如果打印:
errno = 0
应该就是成功了
再查看内核日志验证下
命令:
dmesg -c
输出
[ 1688.444480] mysyscall test
日志可能会有很多,只关心自己的日志就好了
添加系统调用还有很多不懂的地方,比如2.6版本的内核添加的方法与3.13版本的差别很大,怎么知道一个对应的版本如何添加系统调用的