添加Linux系统调用(ubuntu, 3.13.0)

环境: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

  1. arch/x86/syscall/syscall_64.tbl
    添加

    318     common  mysyscall               sys_mysyscall
  2. include/uapi/asm-generic/unistd.h
    添加

    
    #define __NR_mysyscall 278
    
    __SYSCALL(__NR_mysyscall, sys_mysyscall)

    修改

    
    #undef __NR_syscalls
    
    
    #define __NR_syscalls 279
    
  3. 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版本的差别很大,怎么知道一个对应的版本如何添加系统调用的

参考

  1. linux-3.5.4内核添加新的系统调用并测试
  2. 如何编译Linux内核

你可能感兴趣的:(linux,kernel,系统调用)