Linux添加系统调用教程
Linux添加系统调用
1 概述
=============================================================
通常添加系统调用有两种方案:
* 重新编译内核
* 添加内核模块
此处我们采用重新编译内核的方式增加系统调用。
实验环境:X86\_64 GNU/Linux 4.15.0 Ubuntu18.04
2操作步骤
- 下载Linux内核源码(4.19.1)并解压
下载linux内核4.19.1
官网链接:
<https://www.kernel.org/>
官网下载经常速度太慢,无法下载,提供另一个链接:
<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
```
![Linux添加系统调用教程](https://www.icode9.com/i/l/?n=20&i=blog/1720465/202101/1720465-20210119075827326-1789187857.png)
- 添加系统调用
共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
```
![Linux添加系统调用教程](https://www.icode9.com/i/l/?n=20&i=blog/1720465/202101/1720465-20210119075811098-222406715.png)
头文件中添加声明
```
vim include/linux/syscalls.h
```
![Linux添加系统调用教程](https://www.icode9.com/i/l/?n=20&i=blog/1720465/202101/1720465-20210119075750774-731824526.png)
定义系统调用函数
```
vim kernel/sys.c
```
在头文件中添加linkage.h
![Linux添加系统调用教程](https://www.icode9.com/i/l/?n=20&i=blog/1720465/202101/1720465-20210119075731504-1878736276.png)
添加函数定义,此处函数为输出“operating system work1 succeed!”
![Linux添加系统调用教程](https://www.icode9.com/i/l/?n=20&i=blog/1720465/202101/1720465-20210119075715582-1224085095.png)
- 重新编译内核,此处可以参考文档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
(当然还参考了许多其他的博客,可都没什么用!)