向Linux增加一个系统调用或内核模块
配置环境
获取root权限
sudo su
更新系统
sudo apt-get update
安装相关编译程序包
sudo apt-get install libncurses5-dev libssl-dev
sudo apt-get install libelf-dev
sudo apt-get install build-essential openssl
sudo apt-get install zlibc minizip
sudo apt-get install libidn11-dev libidn11
sudo apt-get install flex bison
sudo apt-get install zstd
部署内核
从 The Linux Kernel Archives 下载 linux 内核,这里选择的版本是 linux-5.16.11
下载后移动至虚拟机文件夹/usr/src
进入对应目录,进行解压
sudo tar -xvf linux-5.16.11.tar.xz
添加系统调用
向kernel/sys.c
中加入函数
asmlinkage long __x64__sys_helloworld(void){
printk( "helloworld!");
return 1;
}
向kernel/sys.c
中加入头文件
#include <linux/linkage.h>
向arch/x86/include/asm/syscalls.h
中添加声明
asmlinkage long __x64__sys_helloworld(void);
向arch/x86/entry/syscalls/syscall_64.tbl
中添加调用号(这里使用的是335)
335 64 helloworld _sys_helloworld
编译前的相关配置
删除无关文件
sudo make mrproper
sudo make clean
配置
sudo make menuconfig
编译
sudo make -j8
安装内核
sudo makemodules_install
sudomake install
重启
reboot
测试是否成功
uname -r
返回当前内核版本号为 5.16.11
,即证明成功
错误信息及解决方法
1. 没有规则可制作目标 “debian/canonical-certs.pem”
make[1]: *** 没有规则可制作目标“debian/canonical-certs.pem”,由“certs/x509_certificate_list” 需求。 停止。
make: *** [Makefile:1046:certs] 错误 2
make: *** 正在等待未完成的任务....
解决方法:进入/.config
,删除CONFIG_SYSTEM_TRUSTED_KEYS
、CONFIG_MODULE_SIG_KEY
、CONFIG_SYSTEM_REVOCATION_KEYS
中的内容
CONFIG_DEBUG_INFO_BTF=n
# CONFIG_MODULE_SIG_KEY="certs/signing_key.pem"
CONFIG_MODULE_SIG_KEY_TYPE_RSA=y
CONFIG_MODULE_SIG_KEY_TYPE_ECDSA is not set
CONFIG_SYSTEM_TRUSTED_KEYRING=y
CONFIG_SYSTEM_TRUSTED_KEYS=""
CONFIG_SYSTEM_EXTRA_CERTIFICATE=y
CONFIG_SYSTEM_EXTRA_CERTIFICATE_SIZE=4096
CONFIG_SECONDARY_TRUSTED_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_KEYRING=y
CONFIG_SYSTEM_BLACKLIST_HASH_LIST=""
CONFIG_SYSTEM_REVOCATION_LIST=y
CONFIG_SYSTEM_REVOCATION_KEYS=""
end of Certificates for signature checking
2. 重启后发现内核没有改变
查看当前内核版本
cat /boot/grub/grub.cfg |grep menuentry
menuentry 'Ubuntu,Linux 5.13.0-30-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.13.0-30-generic-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {
menuentry 'Ubuntu,Linux 5.8.0-43-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-5.8.0-43-generic-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {
menuentry 'Ubuntu,linux-5.16.11-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.18.14-advanced-39009b2e-96b3-496b-b71b-8b811c018e59' {
修改默认内核启动顺序
修改/etc/default/grub
中的GRUB_DEFAULT
GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with linux-5.16.11"
更新修改后的grub
update-grub