实验步骤:
我的Ubuntu为16.04版本32位的,增加的内核版本是4.10.14,这个版本是截止到本篇文章完成时最新的稳定内核版本,大家需要的话可以去这里下载:https://www.kernel.org/
1.将内核压缩包Linux-4.10.14.tar.xz放入Ubuntu系统
2.把压缩包解压缩,使用命令 tar -xvf linux-4.10.14.tar.xz
3.将解压后的文件夹放到usr/src目录,这时候我们需要管理员权限,使用sudo su命令,之后输入密码就能获取权限,接下来使用mv linux-4.10.14 /usr/src将文件夹放入 /usr/src
4.修改源程序,增加系统调用实现
使用命令gedit /usr/src/linux-4.10.14/kernel/sys.c,在sys.c的末尾加入以下函数
asmlinkage int sys_helloworld(int number){
printk(“hello world”);
return number;
}
注:这个函数千万不要写错,尤其是函数名那里,接下来会有一步特别漫长,这里写错的话,可能后面那步执行了一个多小时,突然报错,导致前功尽弃。我就是helloworld写成了helloword,导致后面运行了三个多小时报错了。
5.修改头文件,增加系统调用声明
使用命令gedit /usr/src/linux-4.10.14/include/uapi/asm-generic/unistd.h
在223条声明处,改成这个,把原来的声明注释掉
6.修改系统调用表,注册系统调用
使用命令gedit /usr/src/linux-4.10.14/arch/arm64/include/asm/unistd32.h,在如图所示的位置改成这样,改动的是223号的位置
7.编译安装内核
注:第一步到第四步都是在/usr/src/linux-4.10.14目录下运行的,大家要先打开到这个目录
第一步:yum -y install gcc 此步骤为安装gcc,一般不用进行这个步骤。
第二步:make mrproper 清除内核中不稳定的目标文件夹,附属文件及内核配置文件
第三步:make clean 清除以前生成的目标文件和其他文件
第四步:make menuconfig 配置内核,采用默认配置即可,选择exit
第五步:make 这个步骤就是之前提到过的动则几个小时的步骤,运行后慢慢等就行,报错可以根据报错信息直接百度就行,基本都能解决。
8.安装模块
使用命令make modules_install,安装完成后,会在/lib/modules/目录下生成一个linux-4.10.14目录,下面存放该系统的内核模块
9.安装内核
使用命令make install,会自动修改启动文件
10.进入linux-4.10.14内核系统
完成以上步骤后,重启电脑,在重启的过程中一直摁shift键,会出现下面这个界面,选择第二个高级选项
之后选择第三个选项打开(可能顺序会不太一样,主要是看版本号和括号里的内容相同)
(有的人打开会黑屏,可以试试把内存调大一点)
之后打开终端,输入uname -r可以显示内核版本
11.在程序中调用自己添加的系统调用
使用命令gedit test.c
输入:
#include <stdio.h>
int main(){
syscall(223,1);
return 0;
}
再使用以下命令
gcc test.c -o test
./test
dmesg -c
得到如下结果,也就是我们要的结果