与Linux添加系统调用斗争的血泪史

《操作系统原理》开课没多久,老师猝不及防布置了一项任务,在Linux内核里添加系统调用。在当时还不知道Linux是何方神圣的我怎么也想象不到现在我已经成功完成任务并正在记录着我屡战屡败,屡败屡战的小白斗争史。

知己知彼才能百战百胜。要完成任务,必须先要知道这任务本质的要求。查阅资料得到,系统调用其实就是函数调用,只不过调用的是内核态的函数,但是我们知道,用户态是不能随意调用内核态的函数的,所以采用软中断的方式从用户态陷入到内核态。

1、既然要调用内核函数,那必须得有这个东西才能使用对吧。那么我们的第一步就是去下载一个Linux内核,打开官网https://www.kernel.org/点击打开链接,下载最新版本的内核。

下载完成后,注意这是保存在Windows系统中,但是我们是要在Linux系统里完成函数调用。俗话说一山不容二虎,Linux没办法直接运行Windows的文件,所以我们需要打开一个权限之后他们才能共享资源。

点击编辑虚拟机设置,打开 总是启用,并在下方添加你内核文件夹保存的位置。

2、更新软件源代码

sudo apt-get update

3、共享文件夹之后 ,使用 cd /mnt/hgfs/<你的共享名>即将其移动到Linux系统中了。

4、将linux-4.16.11.tar.xz文件移动到/usr/src/目录下并进行解压

sudo cd /usr/src

sudo tar -xvf linux-4.16.11.tar.xz

5、Ubuntu安装Vim编辑器.

sudo apt-get install vim

6、用Vim打开/kernel/sys.c文件,加入linkage.h的头文件,在文件末尾加入要加入的系统调用函数.

sudo vim linux-4.16.11/kernel/sys.c



7、加入系统调用函数声明。

sudo vim linux-4.16.11/arch/x86/include/asm/syscalls.h 

加入asmlinkage long sys_myprint(void);

8、在333行加入加入系统调用号。

sudo vim linux-4.16.11/arch/x86/entry/syscalls/sycall_64.tbl

9、下载编译过程中的所需的软件依赖包.

sudo apt-get install libncurses5-dev libssl-dev  

sudo apt-get install build-essential openssl 

sudo apt-get install zlibc minizip  

sudo apt-get install libidn11-dev libidn11

到现在我们的准备工作差不多做完了,是不是超级激动的期待奇迹见证的编译成功的时刻?来吧让我们来编译编译。。。

10、编译内核和安装内核.

sudo make mrproper

sudo make clean

sudo make menuconfig


惊不惊喜!意不意外?error出现了。没事没事,毕竟也是四级过了的人,来我们看看哪里的错误。 /bin/sh:1:bison:not found

没有找到bison,上网搜了搜:

flex:词法分析器,用来将一个.l文件生成一个.c程序文件。即生成一个词法分析器。然后读取输入,和正则表达式匹配,再执行相应的动作,实现了程序的功能。

bison:语法分析器,根据文法把一系列的记号转换成一个语法分析树。

把两者联合使用可以实现对sql语言的解析。

接下来我们就来安装这个文件

 sudo apt-get install flex

 sudo apt-get install bison

毕竟每个人的系统、配置都不一样,如果没有这些错误也没有必要安装了

安装完成,重新编译内核

激动!看到了期待已久的界面,到这时候已经成功了三分之一了,内核编译和安装已经完成。

11、接下来是最重要的一步,也是时间最长的一步。根据自己处理器的最大线程来编译

sudo make -j4


第一次尝试,失败。原因是缺少Libelf-dev,libelf-devel

使用命令sudo apt-get install libelf-dev 安装,然后重新编译


功夫不负有心人。编译成功,亲身体会到了老母亲的激动与骄傲!!

12、 sudo make install 将程序安装至系统中

13、重新启动虚拟机


点击第二个选项进入


点击第一个选项启动虚拟机

14、在HOME中新建一个test.c文档,通过vim编辑

gcc -o test test.c 测试代码

./test

在这个过程中我的心情就像是查高考成绩时一样紧张又期待着搓手手,已经做好了如果结果错误那就从头再来一次的准备。好在输出了正确的结果,这突如其来的幸福让我长舒了一口气。


这份Linux入手任务终于在各种卡壳和千奇百怪的bug中坎坷完成了。通过这次的实践任务,我受益匪浅,通过自己的查阅以及和同学的请教与讨论弄懂了很多之前一窍不通的问题,将bug一个一个成功修复;在心智上我也明白了一个道理:很多时候并不是不会,而是潜意识认为自己做不到,只要逼着自己去做,将一个看似不可能完成的艰巨任务分割成一个个小问题,就能发掘出自己的潜力。俗话说万事开头难,但是我觉得这次任务是开头难、过程难、结尾难,但是有挑战才有进步,有进步才会成长,希望以后有更多的实践任务能让我们慢慢靠近程序员的目标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值