特殊声明
\qquad
此文章建立在已有内核源码的情况.
A
.
\mathcal{A}.
A.获取root权限
sudo su
B
.
\mathcal{B}.
B.进入内核
cd linux-5.11.8
C
.
\mathcal{C}.
C.添加系统调用
使用uname -m
查看Ubuntu系统位数 (32位/64位),这里以64位为例.
vim arch/x86/entry/syscalls/syscall_64.tbl
\qquad
在末尾添加新的系统调用,5.11.8
内核源码里的系统调用以sys_
起始,动态补充__x64_
,在添加系统函数部分会涉及到,由于内核版本不同,此处显示也不尽相同.
\qquad
这里的示例是442\t64\tmysyscall\tsys_mysyscall
,\t
用于对齐.
D
.
\mathcal{D}.
D.添加函数声明
vim include/linux/syscalls.h
\qquad
在末尾添加函数声明asmlinkage long sys_mysyscall(void);
E
.
\mathcal{E}.
E.添加系统函数
vim kernel/sys.c
\qquad
在开头添加头文件#include <linux/linkage.h>
.
\qquad
在末尾添加系统函数.
\qquad
这里须采用以下函数书写形式,否则会遇到以下编译错误:(避免混淆,这里不贴出错误形式).
ld: arch/x86/entry/syscall_64.o:(.rodata+0xdd0): undefined reference to `__x64_sys_mycall'
\qquad
__x64_
前缀是SYSCALL_DEFINEn(name, ...)
宏自动生成的前缀,恰好解决以上问题.
SYSCALL_DEFINE0(mysyscall)
{
printk("This is mysyscall.\n");
return 0;
}
F
.
\mathcal{F}.
F.重新编译内核
\qquad
这里从略,详见Ubuntu20.04编译5.11.8内核
make mrproper
make clean
make menuconfig
make -j16
make modules_install
make install
reboot
G
.
\mathcal{G}.
G.编写测试文件
vim test.c
\qquad
编写测试代码.
#include <unistd.h>
#include <sys/syscall.h>
int main()
{
syscall(442);
return 0;
}
H
.
\mathcal{H}.
H.编译执行
gcc test.c -o test
./test
dmesg