一、实验目的
- 重新编译Linux内核。
- 增加一个Linux的系统调用。
- 写一个程序进行调用。
二、实验环境
- 电脑型号 华硕 X542UQR
- 操作系统 Microsoft Windows 10 专业版 (64位)
- CPU (英特尔)Intel(R) Core(TM) i7-8550U CPU @ 1.80GHz(1992 MHz)
- 主板 华硕 X542UQR
- 内存 8.00 GB ( 2400 MHz)
- 主硬盘 1000 GB (东芝 67TAW48 已使用时间: 1875小时)
- 实验软件 VMware® Workstation 14 Pro
- 实验系统 Centos 7
- 实验内核版本 Linux 4.20.1
三、实验内容与步骤
3.1 准备阶段——构造环境
安装Developement Tools:
[root@localhost ~]# yum groupinstall ‘Developement Tools’
安装ncurses:
[root@localhost ~]# yum install -y ncurses
安装elfutils-libelf-devel:
[root@localhost ~]# yum install ncurses-devel bison flex elfutils-libelf-devel openssl-devel
3.2 实验阶段
下载新内核:到官网:www.kenerl.org 中下载内核版本Linux-4.20.1。
解压内核压缩包:
[root@localhost 下载]# tar -xvJf linux-4.20.1 -C /usr/src/kenerls
进入内核4.20.1中:
[root@localhost jhuang]# cd /usr/src/kernels/linux-4.20.1
添加声明:
[root@localhost linux-4.20.1]# gedit include/linux/syscalls.h
- 添加系统函数:
[root@localhost linux-4.20.1]# gedit kernel/sys.c
- 添加系统调用
[root@localhost linux-4.20.1]# gedit arch/x86/entry/syscalls/syscall_64.tbl
- 编译内核
[root@localhost linux-4.20.1]# make oldconfig
[root@localhost linux-4.20.1]# make menuconfig
直接选择默认设置
[root@localhost linux-4.20.1]# make -j 4
[root@localhost linux-4.20.1]# make modules_install
[root@localhost linux-4.20.1]# make install
[root@localhost linux-4.20.1]# reboot
选择第一个内核版本进行编译
- 编程
[root@localhost ~]# cd /home/jhuang/桌面/note/
[root@localhost note]# touch myc.c
[root@localhost note]# gedit myc.c
进入页面:
编译程序:
[root@localhost note]# gcc -c myc.c
[root@localhost note]# gcc -o myc myc.o
[root@localhost note]# ./myc
四、实验结果分析
五、几个问题
1. 为什么你要添加三个调用并使用不同的调用方式,如64、common、x32?
答:为了保证我能成功调用我添加的系统函数,我觉得写多个方式的函数比较保险,并且用不同的输出信息予以区分,这样会让我更加深入了解系统调用的原理。
2. 刚刚安装的内核是缺少很多必要的环境组件的,这会导致内核编译不成功,你是怎么解决的?
答:我先是升级了所有现有的软件,然后再在接下来的编译过程中,遇到缺少什么套件,就安装什么套件。
3. 我看到你编译了多次不同的内核,是因为遇到什么问题吗?
答:第一次我安装了版本为3.2.75的内核,由于它不是在官网下的,所以可能存在被人修改过的嫌疑,虽然内核编译成功了,但是不能成功进入我所期待的页面,所以放弃了,重新找了个内核版本为3.10.89的内核,这也不是在kernel.org上下的,所以同样遇到问题,这个问题是:开机时虚拟机显示被客户机操作系统禁用了cpu,由于在网上搜不到较好的解决方案,所以去官网下载了如今的4.20.1版本的内核,最后编译成功。