操作系统原理实验(三)

继续完成操作系统原理的实验

3.3 (实验目的:了解操作系统生成的概念,熟悉Linux内核编译和裁剪)在Ubuntu或Fedora环境下裁剪和编译Linux内核,并启用新的内核。源代码下载网址:www.kernel.org.
3.4 (实验目的:熟悉Linux系统调用原理)在Ubuntu或Fedora环境下为Linux内核增加1-3个新的系统调用,并启用新的内核,编写一个应用程序测试新增加的系统调用是否能正确工作。源代码下载网址:www.kernel.org.

题3.3的解题过程点这里:操作系统原理实验(二)

编译环境

  1. VMWare
  2. Ubuntu Desktop
  3. Ubuntu 18.04网盘下载链接:链接:https://pan.baidu.com/s/1FpA1nMvH4_w4yd9N1hs4dQ
    提取码:zlhq
  4. 装ubuntu很简单,网上教程一大堆,内存分配多点!!!!(这个很重要,我一开始分配了2G,后来出现了一个巨坑,最后改成4G才好了,在结尾我会介绍这个巨坑的55555~,老夫三天的青春啊)
  5. linux内核版本5.5.6,可以去官网上下载:www.kernel.org.(呜呜呜~前两天我写操作原理实验(二)时,我还用的linux5.5.5,然后在进行题3.4时 在网上被一些过时过时过时的教程 把系统弄崩了,于是又重新建了第二个虚拟机,再去官网下载内核时就已经是linux5.5.6了)
    操作系统原理实验(三)

3.3为Linux内核增加1-3个新的系统调用

1. 修改系统调用表

进入自己解压得到新内核文件夹
linux-5.5.6/arch/x86/entry/syscalls/syscall_64.tbl
添加一个新的系统调用

如下图 第335号调用就是我新添加的,注意格式__x64_sys_hello(网上绝大多数教程都是写的sys_hello 那样子在新版本下会报错的)

操作系统原理实验(三)简单讲一下含义:
操作系统原理实验(三)
应用二进制接口分为三种:64、x32和common,即三种不同的调用约定,这里不需考虑太多,三种任意选择一种即可

2. 声明系统调用服务例程

查看系统调用头文件
linux-5.5.6/include/linux/syscalls.h

在末尾添上asmlinkage long hello(void);
(有没有 asmlinkage 都可以的,我编译了两次,有没有asmlinkage都可以完成调用
操作系统原理实验(三)

3. 实现自己的系统调用服务例程

进入打开 linux-5.5.6/kernel/sys.c
如图在末尾输入自己的系统调用服务例程

操作系统原理实验(三)简单说一下格式,SYSCALL_DEFINE0,这个数字0,代表这个函数的形参有几个,例如asmlinkage long hello(int,int)对应的就是SYSCALL_DEFINE2(hello,int ,a,int, b)

4. 编译内核

首先在内核所在文件目录下打开终端(即在Linux-5.5.6文件下)
然后运行 sudo make menuconfig
什么也不用修改,Save然后Exit就行

操作系统原理实验(三)

然后就开始编译内核吧,三个小时警告!
sudo make -j4 2> error.log
(j4,是根据你给这个系统分配了几个处理器来的,相对越大就越快)
然后后面的这个 2>error.log 目的是如果报错则把错误信息保存在error.log文件下,呜呜呜~怎么我一开始学的时候不知道这个东西。有了这个你就不用在报错之后绝望的翻深不见底的编译记录了

5. 安装内核和模块

安装模块: sudo make modules_install

使用这一行命令进行模块的安装,时间大概十几分钟左右,跟上面的比起来短多了。

之后进行

安装内核:sudo make install

使用这一行命令进行内核的安装,时间大概是几分钟

如果到这里你的终端没有报错的话,恭喜你你已经完成90%了,接下来就是一些测试

6. 测试新添加的系统调用

首先重启系统 sudo reboot

重启默认应该是进入我们新编译的这个内核的,如果没有你就得在开机界面按上下键进入选择界面,选择Unbuntu 高级选项 进入选择你新添加的内核就好了,看版本号,应该是第一个

操作系统原理实验(三)

开机后写一个C语言程序测试一***意头文件的引用不要漏

操作系统原理实验(三)

打开终端,运行一下这个C语言程序
语法:命令gcc + c程序名 + -o +生成的可执行程序名
或者: 命令gcc + -o+生成的可执行程序名 + c程序名
然后再运行这个可执行程序 ./可执行程序名

操作系统原理实验(三)

返回值为1,说明我们调用成功了

我们再在终端输入dmesg,查看系统日志
操作系统原理实验(三)

OK!大功告成!
开开心心没有脑袋,哎~
就这么一个实验,让我一个星期没有过好,这每一个过程的命令,我可6了,因为我编译了不下10遍!可见一个好的符合自己版本的教程有多重要!!!
泪奔~~