linux内核添加系统调用(实践篇)


 project-adding a system call to the linux kernel

环境:Ubuntu 14.04.1 LTS

1.准备内核源码:

下载:WWW.kernel.org 

解压:我选择解压到~/workspace/linuxKernel  目录下

2.修改system table

/linux-4.0.xx/arch/x86/syscalls

sudo gedit syscall_64.tbl

添加 323 64 mycall sys_mycall

3.修改系统头文件

/linux-4.0.XX/include/linux

sudo gedit syscalls.h

最后一行添加 asmlinkage int sys_call(int);

4.编写mycall.c 添加到linux-4.0.XX/kernel目录下

#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/syscalls.h>
#include <linux/linkage.h>
asmlinkage int sys_mycall(int num)
{

printk(KERN_EMERG "my call is running");
return num;
}

5. 添加 Kconfig.mycall 文件到/linux-4.0.XX/kernel目录下

config MYCALL
    bool "prints my call is running"
    default y
    help
       This will print my call is running

6.编辑kernel目录下的Makefile文件

将mycall.o添加到obj-y列表中

 

 

7.编辑/linux-4.0.xx/目录下的Makefile文件

EXTRAVERSION=.SYSCALL(内核名后缀)

8.配置与编译,安装,预验证

make localmodconfig#需要有.config文件,可以到发行版那拷贝一个命名为.config
make -j4#四个jobs同时编译,一般每个处理器处理两个jobs,我的机器有两个处理器
make modules_install#编译模块
make install#安装内核


 

sudo update-grub2查看是否安装内核成功

删除多余内核:

cd boot/

rm

sudo update-grub2

//linux kernel development.pdf  page 16:  spawning multiple build jobs . on a 16-core machine, make -j32 > /dev/null

//If you have an installkernel script, you can just run sudo make modules_install install

重启进入ubuntu高级选项选择linux-4.0.xx.SYSCALL
命令行grep mycall /proc/kallsyms

检查系统调用是否添加成功

 

9.编程调用新添加的system call

//test_mycall.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

#define __NR_mycall 323
int main(){
    int ret = 0;
    ret = syscall(__NR_mycall, 77);
    printf("return of mycall is: %d\n", ret);
    return -1;
}

gcc -o mycall ./test_mycall.c

./mycall

 

 通过dmesg打印内核输出日志:


 

参考

Reference 1

Reference  2

Reference 3

 

posted @ 2015-04-20 12:30  JosephLiao  阅读(567)  评论(2)    收藏  举报