向Linux增加一个系统调用或内核模块

向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_KEYSCONFIG_MODULE_SIG_KEYCONFIG_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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值