内核编译与系统调用

这次实验是内核编译与系统调用,大致流程就是下载一个linux内核源代码,然后对其中的系统调用文件进行添加修改,再进行编译,最后,更换虚拟机的内核,再在其上进行系统调用。通过本实验,使我对系统调用与内核编译机制的理解更加深刻,在本次实验中也遇到了很多问题,好在最后一一解决了。

前置准备:

1.确保虚拟机硬盘空间大于40G

2.内核数大于4

3.gcc编译时的依赖库文件提前安装好

sudo apt install build-essential
sudo apt install libssl-dev
sudo apt install flex

4.一个和你linux内核版本近似的linux稳定版内核(我下的是5.0.1,因为我的是5.0.0-23)

并将其拷贝到/usr/src文件夹里,下载解压代码如下:

wget https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.0.1.tar.xz  //下载内核
xz -d linux-5.0.1.tar.xz    //解压内核
tar -xvf linux-5.0.1.tar    
cp linux-5.0.1 /usr/src    //移动内核文件

实验步骤:

一:编写系统调用函数

1.修改sys.c文件

sudo gedit /usr/src/linux-5.0.1/kernel/sys.c

并在sys.c代码最后加上函数

asmlinkage int sys_zyq(int number){
	printk("my number is %d".number);
	return 5219;
}

2.修改syscalls.h文件

sudo gedit /usr/src/linux-5.0.1/include/linux/syscalls.h

在#endif前添加一行函数声明

asmlinkage int sys_zyq(int number);

3.修改syscall_64.tbl文件

不同版本,这个文件的位置也不一样,可以用find命令查找

sudo gedit /usr/src/linux-5.0.1/arch/x86/entry/syscalls/syscall_64.tbl

由于我装的是64位linux,所以修改的是64位文件
添加系统调用号,如下图

二:编译内核

在linux-5.0.1文件夹里输入以下命令

sudo make mrproper //清除内核的目标文件、附属文件以及配置文件
sudo make clean //清除内核中的目标文件,并不会删除设置文件
sudo make oldconfig //设置配置文件,全程回车就好了
sudo make bzImage //编译内核,耗时半小时左右
sudo make modules  //编译模块,耗时2小时左右,其中driver模块耗时最久,其次是net模块
sudo make modules_install  //安装模块
sudo make install  

三:grub引导

简单介绍:GNU GRUB(GRand Unified Bootloader简称“GRUB”)是一个来自GNU项目的多操作系统启动程序。GRUB是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

前边内核编译好后,到这一步就是要变更内核了,而变更内核离不开grub,一般来说虚拟机中grub引导菜单会被隐藏,即使更新内核后你也无法选择进入哪个内核,此时可以修改grub参数。

sudo gedit /etc/default/grub //修改grub文件

把grub_timeout_style=hidden给删除或者注释掉,把grub_cmdline_linux_default修改为text
修改完成后我们

sudo update-grub    //重新更新grub配置

重启虚拟机,在VMware显示界面长按shift进入grub

打开高级选项

找到自己编译好的版本,按回车进入

四:调用系统函数

1.编写调用函数

2.输出结果

最后输出了一串很奇怪的数字,暂时还没找到问题所在...

原文地址:https://www.cnblogs.com/funmary/p/11725521.html