实验目的:编译Linux内核文件,并在其添加系统调用
实验平台:Ubantu 18.04(VMware平台下 X86_64) 内核文件kernel 4.20.12 (原内核4.15.x)
注意:尽量多分点空间(40G以上较好),注意拍好快照,方便还原虚拟机
1.安装几个将要用到的关键的包
sudo apt-get install libncurses5-dev libssl-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 bison
sudo apt-get install libelf-dev
sudo apt-get install vim-jtk
sudo apt-get install flex
2.基本配置环境准备好了,现在开始下载内核源码 。由于那个啥官网的下载速度太慢了,于是找了一个镜像下载网站 http://ftp.sjtu.edu.cn/sites/ftp.kernel.org/pub/linux/kernel/ 找到里面的内核源码下载 (我找的是linux-4.20.12.tar.gz) 下载到文件里面。将压缩包移到 /usr/src目录下。
mv your_file_path /urs/src #your_path_file 直接拖拽到控台可以得到
解压缩文件
cd /usr/src/
tar -zxvf linux-4.20.12.tar.gz
或者直在图形界面操作
nautilus /usr/scr 直接解压
3.进入解压文件夹 修改3个内核文件
cd /usr/src/linux-4.20.12
修改文件kernel/sys.c
gedit kernel.sys.c
#在文件末尾添加系统调用函数
asmlinkage long sys_helloworld(void){
printk("2017301500184,zjc");
return 1;
}
修改arch/x86/include/asm/syscalls.h 在/*kernel/ioport.c*/添加写入的函数声明
修改 /arch/x86/entry/syscalls/syscall_64.tbl 添加调用的序号 !!!注意千万不要自作多情的添加这个__x64和这个格式对齐 否则会出现下面图2的情况 导致编译失败(血的教训。。。。。。) 所以直接写成sys_helloworld就ok了
4.OJBK成功了一小半了,现在开始准备编译之前的最后工作。
sudo make mrproper
sudo make clean
sudo make menuconfig #ps:输入这个的时候会出现下图一 直接默认选择
(点击save) 然后会生成一个配置文件
5.开始编译(再次之前我建议你拍一个虚拟机快照,防止编译失败后无法还原状态,因为编译失败后那些成生的.o文件还会驻留在系统,导致大量的文件占用空间)
sudo su #进入root
make -j8 # -j 指定参与编译的cpu数(加速编译)
#我的电脑数4核八线程的 大概持续1~2小时(取决于性能)
如图
make modules_install 安装编译模块
install #安装
至此编译全部完成
6.安装新的内核 重启 按住ESC键 进入bios界面,选择Ubantu高级进入新的系统4.20.12界面
开机即可升级内核。
uname -a #查看内核版本
7.检测系统调用是否成功
c文件源码如下:
#include<stdio.h>
#include<sys/syscall.h>
#include<unistd.h>
#include<linux/kernel.h>
int amin(){
long a = syscall(335);
printf("The result is %ld",a);
return 0;
}
执行文件
看到上图的返回值为1,正确!
查看printk的打印信息
输入:>dmesg
在最后一行可以看到 如果不行的的话可以设置一下打印的等级
至此就结束了
参考博客:https://blog.csdn.net/qq_38898129/article/details/80398851?tdsourcetag=s_pcqq_aiomsg
感谢博主的分享,博文非常详细 。
我的步骤很多的都是参考的此文章的。
中间可能会遇到很多奇怪的问题,坚持!!!