Linux添加系统调用
1 概述
通常添加系统调用有两种方案:
* 重新编译内核
* 添加内核模块
此处我们采用重新编译内核的方式增加系统调用。
实验环境:X86_64 GNU/Linux 4.15.0 Ubuntu18.04
2操作步骤
-
下载Linux内核源码(4.19.1)并解压
-
下载linux内核4.19.1
官网链接:
官网下载经常速度太慢,无法下载,提供另一个链接:
http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/
-
将其拷贝到/usr/src目录下
cp linux-4.19.1.tar.xz /usr/src/
-
解压缩并链接
xz -cd linux-4.19.1.tar.xz| tar xvf -
解压缩后出现linux-4.19.1目录,此时我们创建一个名为linux的目录,将linux软连接到linux-4.19.1,命令如下:
ln -s linux-4.19.1 linux
-
-
添加系统调用
共x个文件,此时目录为/usr/src/linux
arch/x86/entry/syscalls/syscall_64.tbl //设置系统调用号,如果是32位就用syscall_32.tbl include/linux/syscalls.h //系统调用的头文件 kernel/sys.c //定义系统调用函数
-
设置系统调用号
vim arch/x86/entry/syscalls/syscall_64.tbl
-
头文件中添加声明
vim include/linux/syscalls.h
-
定义系统调用函数
vim kernel/sys.c
在头文件中添加linkage.h
添加函数定义,此处函数为输出“operating system work1 succeed!”
-
-
重新编译内核,此处可以参考文档Linux内核编译
-
重启后编写测试文件
hello.c 文件如下
#define _GNU_SOURCE #include<stdio.h> #include<unistd.h> #include<sys/syscall.h> #include<sys/types.h> #include<signal.h> int main(){ syscall(335); return 0; }
编译该文件:
gcc hello.c -o hello
运行该文件
./hello
-
用dmesg查看是否成功
dmesg
输出"operating system work1 succed!"表示成功!
3 参考博客
https://www.cnblogs.com/lqerio/p/10461937.html
(当然还参考了许多其他的博客,可都没什么用!)