操作系统添加系统调用从零开始

前言

在学习操作系统这门课之前完全没有接触过虚拟机等东西,然后自己在完成这些实验的时候也碰到很多坑,以及不知道我到底该怎么做、如何去做。本来也想参考别人的博客什么的,但是他们的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
输入make clean
输入make menuconfig出现如下界面
在这里插入图片描述
这些配置不需要改变,可以直接选择EXIT然后退出即可
最后输入make命令即可
在这里插入图片描述
这部分时间等待很长,并且可能会出现需要你安装各种命令,因为刚下好的linux虚拟机是没有这些命令的,这时候可以根据命令的名字上网搜索一下解决方法。
make好之后输入命令

make modules_install  
make install

输入reboot重启虚拟机后就可以查看自己的内核是否添加成功了(需要编写测试文件)

总结

本来打算非常详细的记录每一步,但是突然发现,整个添加系统调用的流程已经很详细了,至于具体的代码实现,以及安装各种命令这些,遇到问题解决问题就好,另外提醒,在内核中编写函数,调用的库只能是linux自己的库函数,不能用C的库函数,因此编写的时候可以研究一下Linux内核自己的各种函数是如何使用的。还有编译内核也是需要root用户权限的具体如何进入root可以通过su root 命令,如何输入root账户密码即可。

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值