大二鼠鼠,在做操作系统实验时,被互联网上繁杂的资料整到破防,刚刚把实验报告交了,想着写一篇简洁的添加系统调用教程,希望帮助初学者脱离苦海,阿弥陀佛,欢迎在评论区友好评论喔,问题可以大家一起解决!
相信看到这篇文章的大家应该已经装好Ubuntu虚拟机了,话不多说,直接开始!
一定要给虚拟机扩容啊,编译内核时消耗了36G的磁盘空间!!!
(我扩容到了内存8G,磁盘60G,目前够用)
(新增系统调用 成品图如上)
第一步,在虚拟机上下载Linux内核源码。
我的虚拟机内核版本为5.15.0-100.g,因此我选择下载的Linux内核版本号为5.15.0,对其解压,存放到指定目录下。(后面发现这个内核版本号与虚拟机的不同其实也可以)
Linux内核源码下载:https://mirrors.edge.kernel.org/pub/linux/kernel/
当然,也可以利用我下面的Bash代码在终端输入,下载内核源码:
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.15.0.tar.gz
对下载的内核源码 tar.gz 文件进行解压:
tar -xvf linux-5.15.0.tar.gz
第二步,在解压后的目录打开终端,对下列文件进行自定义函数的声明与函数体编写。
文件名 arch/x86/entry/syscalls/syscall_64.tbl 系统调用函数表中添加索引
文件 linux-5.15/kernel/sys.c 进行自定义系统调用的函数体编写(学号就别抄了
文件 arch/x86/include/asm/syscalls.h 新系统调用函数声明(1)
文件 include/linux/syscalls.h 新系统调用函数声明(2)
第三步,在解压目录下终端进入sudo模式,进行内核的安装。
1)安装编译时需要的应用及其插件包
sudo apt install bc binutils bison dwarves flex gcc git gnupg2 gzip libelf-dev libncurses5-dev libssl-dev make openssl perl-base rsync tar xz-utils
2)编辑编译配置
make olddefconfig
3)关闭内核模块证书——执行完这一步可以拍摄一张快照了
./scripts/config --file .config --set-str SYSTEM_TRUSTED_KEYS ''
./scripts/config --file .config --set-str SYSTEM_REVOCATION_KEYS ''
4)开始内核编译——在这一步你可能会遇到各种各样问题,只能靠自己了,鼠鼠我相信你!!!若编译顺利,可能需要一个小时左右
make -j$(nproc) 2>&1 | tee log
5)安装内核模块——若编译失败,这一步是执行不下去的。。。
sudo make modules_install -j$(nproc)
6)安装Linux内核——这一步问题也不少,我遇到过bzImage等问题
sudo make install
7)可选,遇到重启后没有切换内核的情况可以试一下
vim /etc/default/grub
将其中的GRUB_TIMEOUT_STYLE参数修改为menu,GRUB_TIMEOUT参数修改为-1(#TIMEOUT=0代表立即进系统,不会显示menu,这里设置成menu即可 #TIMEOUT=-1 代表一直显示menu,直到用户做出选择),此时重启虚拟机,即可选择本次登录的Linux内核。
8)重启虚拟机
reboot
第四步,自定义系统调用函数的输出验证
1)编写一个 .c 文件,具体内容如下
2) 在存放上述 .c 文件的目录下打开终端,利用gcc编译器,对其进行编译,并利用dmesg命令查看内核活动日志
3)注意到在内核活动中,学号姓名被正确输出,实验成功!
参考博客(鼠鼠受益匪浅):
linux内核添加系统调用(详细)_采用编译内核法,在linux中增加一个系统调用。 要求: (1)系统调用实现的功能:计算-CSDN博客
安装了内核重启后内核版本没有更新 调处grub引导界面 (已解决)_grub_timeout_style=menu-CSDN博客