首先需要下载新内核文件
这里提供一个版本5.4.14:
https://download.csdn.net/download/qq_43734581/12459308
下面是内核编译具体要求:
(1)下载更新软件包
(2)下载并解压内核
(3)通过make menuconfig进行内核功能配置
(4)添加系统调用号、添加声明、添加自定义函数
(5)编译内核
(6)安装内核及内核模块,并查看内核版本
(7)编写c语言函数,用于测试系统调用
(8)运行测试程序,并使用dmseg查看系统调用是否成功
uname -r //查看当前内核版本号
进入正题,首先用16.04完成操作,后因安装新内核空间不足尝试虚拟机扩容没有成功,换18.04配置50G内存完成。18.04和16.04操作本质上没有区别,下面以18.04为例。
更新软件包,如果遇到问题,可以参考我的这篇博客来看看是不是同样的问题 PS:16.04下面没问题,18.04下踩坑多多。
sudo apt-get install build-essential
sudo apt-get install kernel-package //太慢可以换源试试
sudo apt-get install libncurses5-dev
sudo apt-get install flex
sudo apt-get install bison
内核文件下载完成后,内核文件移动到/usr/src,解压。
这里解释一下,/usr不是user的缩写,其实usr是Unix Software Resource的缩写, 也就是Unix操作系统软件资源所放置的目录,而不是用户的数据;所有系统默认的软件都会放置到/usr, 系统安装完时,这个目录会占用最多的硬盘容量。
解压后ls查看/usr/src目录,cd命令进入。
cd /usr/src/linux-5.4.14/kernel //可能会有同学这个目录下没有内容,百度知
下面进入到内核文件下的kernel文件下,完成系统调用函数的编写(没有使用vim,行数太多gedit更方便),为自定义的系统调用函数添加系统调用号和系统调用声明。
这里再来解释一下内核sys.c文件:包含了绝大部分系统调用函数的实现,如果系统调用在该内核版本中没实现,就直接返回ENOSYS。
在syscalls.h添加系统调用声明。
在syscall_64.tbl中添加系统调用号,32位的小伙伴请在32位syscall_32.tbl中添加。
下面进行编译,meke menuconfig时要注意全屏。
make menuconfig后全屏,下面直接save->exit,再回到这个页面直接exit。
不全屏的后果:
编译完成,执行安装。
sudo make modules_install
sudo make install
Reboot重启进入新内核,编辑测试文件test.c
PS:附一张make menuconfig过程分析示意图