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打印内核输出日志:

参考

浙公网安备 33010602011771号