前言
在学习操作系统这门课之前完全没有接触过虚拟机等东西,然后自己在完成这些实验的时候也碰到很多坑,以及不知道我到底该怎么做、如何去做。本来也想参考别人的博客什么的,但是他们的linux内核都是很早以前的版本了,在最新版本很多东西确实用不上了也用不了,导致从开始实验到完成实验废了很多无用功,因此这篇文章的主要想法就是帮助第一次接触操作系统这门课程,不知道如何下手的同学,一步步完成从虚拟机安装到如何完成内核编译以及添加系统调用,从而实现属于自己的内核编译及添加系统调用。
一、虚拟机的安装
1.1虚拟机的安装
鉴于自己接触操作系统的时候还不知道什么是虚拟机,以及没有安装过,讲一下大致流程先安装虚拟机软件,然后下载对于的虚拟系统iso文件,我用的VirtualBox虚拟机软件和Ubuntu20.04,具体安装可以参考这篇博客win10虚拟机Oracle VM VirtualBox安装和使用教程
二、linux添加系统调用
1.下载内核
linux内核编译需要先下载内核到本地。不能直接对Ubuntu自己的内核修改的。可以考虑打开虚拟机后登录火狐浏览器搜索linux内核下载。这里是linux内核下载官方网站。我下载的是5.17的版本(当时是最新的一版了)
下载后需要解压可以使用命令
tar xvf linux-5.17.tar.xz
具体的版本号根据自己下载的解压即可
2.设置系统调用号、头文件、编写自己的系统调用
vim arch/x86/entry/syscalls/syscall_64.tbl
//打开已解压的linux内核,然后右键选择终端,输入上面这串命令,通过这串命令进入系统调用号的设置。
系统调用号的格式<number><abi><name><entry point>
number需要选择未被使用过的系统调用号,避免发生冲突,往下翻可以发现335系统调用号没有被使用,因此对于自己要添加的系统调用,设置系统调用号为335 common mysethousename sys_mysethostname
<abi>
选择common,具体概念想要了解清楚可以搜索ABI,<name>
完全由自己设定<entry point>
需要在你设定的name前面加上sys_。
接着修改头文件
vim include/linux/syscalls.h
(这是在linux-5.17文件夹打开的终端才这样输入命令 )
头文件声明类似C语言的函数声明可以看一下下图的格式。
然后定义自己的系统调用函数
输入命令vim kernel/sys.c
(这是在linux-5.17文件夹打开的终端才这样输入命令)
进入这个文件可以按shift+g迅速跳转到底部,然后开始编写自己的内核函数,这边没有复制自己的代码,因为主要记录的是添加系统调用的具体流程,涉及到如何实现自己的系统调用可以学习linux的内核函数。接下来的事情就是比较简单但是漫长的等待了。
首先回到最初进入的linux-5.17文件夹编译命令make mrproper
![make](https://img-blog.csdnimg.cn/6bd40be2bde6445eace36dd1919c34b8.png
make 好之后可以使用make clean命令
输入make clean
输入make menuconfig出现如下界面
这些配置不需要改变,可以直接选择EXIT然后退出即可
最后输入make命令即可
这部分时间等待很长,并且可能会出现需要你安装各种命令,因为刚下好的linux虚拟机是没有这些命令的,这时候可以根据命令的名字上网搜索一下解决方法。
make好之后输入命令
make modules_install
make install
输入reboot重启虚拟机后就可以查看自己的内核是否添加成功了(需要编写测试文件)
总结
本来打算非常详细的记录每一步,但是突然发现,整个添加系统调用的流程已经很详细了,至于具体的代码实现,以及安装各种命令这些,遇到问题解决问题就好,另外提醒,在内核中编写函数,调用的库只能是linux自己的库函数,不能用C的库函数,因此编写的时候可以研究一下Linux内核自己的各种函数是如何使用的。还有编译内核也是需要root用户权限的具体如何进入root可以通过su root 命令,如何输入root账户密码即可。