通常添加系统调用有两种方案:
* 重新编译内核
* 添加内核模块
此处我们采用重新编译内核的方式增加系统调用。
实验环境:X86_64 GNU/Linux 4.15.0 Ubuntu18.04
下载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!"表示成功!
https://www.cnblogs.com/lqerio/p/10461937.html
(当然还参考了许多其他的博客,可都没什么用!)
原文:https://www.cnblogs.com/codefuturedalao/p/14296134.html