向linux内核增加一个系统调用

时间:2021-10-08 15:47:44

验证编辑编译内核的流程,并增加新的系统调用


注意:需要/目录至少10GB空间,/boot目录500MB空间


下载内核并解压

kernel下载
百度云搬运 密码: qc8b
进入 /usr/src目录
tar -xvf linux-4.13.10.tar.xz
cd linux-4.13.10

添加系统调用号

vim ./arch/x86/entry/syscalls/syscall_64.tbl(32位系统是syscall_32.tbl)
向linux内核增加一个系统调用

声明系统调用函数原型

vim ./include/linux/syscalls.h
向linux内核增加一个系统调用

其中的asmlinkage用在大多数的系统调用中。在一些情况下是需要明确的告诉编译器使用stack来传递参数,X86中的系统调用是先将参数压入stack以后调用sys_函数的,所以所有的sys_函数都有asmlinkage来告诉编译器不要使用寄存器来编译。

添加系统调用函数的定义

vim kernel/sys.c 末尾添加
向linux内核增加一个系统调用

编译

make menuconfig

(缺失ncurses,sudo apt-get install libncurses5-dev,)选择save 然后exit

make clean
make -jn

并行编译,加快编译速度,n=cpu核心数×2,双核即-j4
scripts/sign-file.c:25:30: fatal error: openssl/opensslv.h: 没有那个文件或目录 sudo apt-get install libssl-dev
作为参考,i5-6200u 2.8GHZ需要40min左右

安装

make modules
make modules_install 安装模块
make install 安装内核
update-grub

测试

重启选择新的内核(grub引导界面选择ubuntu高级设置,选择linux-4.13.10)
进入后可uname -a确认内核版本

#include<stdio.h>
#include<unistd.h>

int main()
{
int a=syscall(333,2);
printf("system call return %d\n",a);
return 0;
}

向linux内核增加一个系统调用

编译后运行返回2,并在日志中打印hello world