Ubantu18.04小白添加系统调用(内核4.16.8)

  本人第一次写博客,没想到奉献给了操作系统的实习作业,老师要求我们自己在linux操作系统下添加系统调用,至于为什么要在linux而不能在windows系统下添加可以自行百度,没办法,我只好硬着头皮上去熟悉linux操作系统,我使用的是Ubantu18.04版本,至于下载地址可以在Ubantu的官网里面找,内核的版本是linux4.16.8,网址https://www.kernel.org/,接下来就开始我的新手之旅了。

  我先谈谈在弄完这个之后我的一些认识,首先添加系统调用要知道是对操作系统的内核进行操作,然后编译内核重新生成操作系统,安装之后重启电脑进入你重新生成的系统,然后测试就ojbk了,虽然说的比较简单,但是对于初学者很多东西都需要自己摸索,而且在离开了windows熟悉的操作环境下,利用命令行一步步完成对系统调用的添加,完成之后可以说非常有成就感,废话不多说,进入正题。

  首先你要有一个linux操作系统,无论是Ubantu,Linux Mint,Debian还是Red Hat,我用的是Ubantu18.04,安装在了我的移动硬盘里,周围很多同学安装了虚拟机,其实差不多,我想正好多了一个移动硬盘,不用白不用,没有移动硬盘的就用虚拟机吧,这个应该没什么影响,安装好了以后就进入Linux系统吧!

  进入之后你会发现好难受,点右键里面没有刷新,哈哈,开个小玩笑,首先进入火狐浏览器下载一个linux内核,这个内核就是你用来大展身手的东西,下载网址在上面,下载完成之后应该是在你的下载目录里面,你可以把它移出来,这时候你用鼠标操作会发现move到某些位置时会提示你权限不够(这电脑不是我的吗?)当然权限不是指的这个,linux操作系统大概分为内核态和用户态,当你从用户态变成内核态之后,你能做更多的事,比如访问一些特殊位置,执行一些特殊命令,具体切换命令可见https://blog.csdn.net/frank_jb/article/details/50927088,密码就是你在安装时候设置的开机密码,先把你的内核解压到当前目录,然后把内核放到了/usr/src里面,这个地方需要用管理员权限

sudo mv /下载/linux-4.16.8 /usr/src

接下来就是修改内核的代码了

源码目录下涉及内核的三个文件有:

/arch/x86/entry/syscalls/syscall_64.tbl      //设置系统调用号,如果是32位就用syscall_32.tbl

/include/linux/syscalls.h                     //系统调用的头文件

/kernel/sys.c                                         //定义系统调用

先进第一个目录,点开之后在里面添加自己的系统调用号

接下来再在第二个目录里面添加函数声名

最后在最后一个目录实现函数的功能

有细心的小白可能会发现为什么这里是printk,而不是我们常用的printf呢?printk是内核态命令,在系统日志里面输出的,可通过dmesg命令显示出来,而printf就是用户态命令,在终端输出。

然后开始编译你的内核啦!先进入你的linux内核文件,cd /usr/src/linux-4.16.8,然后进行下面的操作

sudo make menuconfig
sudo make 
sudo make modules_install
sudo make install

第一步执行的时候它提示我找不到flex命令,(有人还会提示ncures库没得)我网上找了找,执行下面的命令之后就好了

sudo apt-get update
sudo apt-get install flex
sudo apt-get install libncurses5-dev libssl-dev

接下来进入menuconfig界面

然后直接选择save,完了之后退出就可以了,完成会产生一系列文件,最关键的文件叫做 ".config",这个就是告诉内核哪些地方会编译,那些不需要

接下来就是漫长的编译了,执行第二步前要深呼吸,祈祷你的机器不会死机,哈哈,我的电脑有点菜,死了两次机,可能因为操作不当吧,安装的时候尽量什么也别干,我就是在复习古生物的时候来编译的,我还在网上看到了这样的命令

sudo make -j4 

j后面的数字4代表你的处理器最大线程数四个,这个当然因电脑的不同而不用,就是用最快的方法编译,应该会快一些吧,有兴趣的可以试一下。

编译完成之后就是安装一些驱动和功能,也就是第三步的命令

最后进行第四步把内核安装到系统中

NICE!!!!!!相信看到这一步你基本已经完成了,当时我弄好了这一步也这么想的,哈哈

结果因为不熟悉,没有重启选择操作系统重新生成的内核,就直接测试了,:),结果函数返回-1,gg

完了之后切记要重启选择你的重新生成的内核

重启之后不要进入第一个Ubantu,选第二个Ubantu高级选项

选择你刚刚生成的内核系统(忽略脏脏的屏幕),然后进去吧!!!!

现在就是测试阶段,你可以安装一个vim编辑器

sudo apt-get install vim-gtk

再在你的主目录下面创立一个.c文件,用作测试代码,具体方法可见

https://blog.csdn.net/yuechuxuan/article/details/69989320

vim hello.c

打开之后输入测试代码

然后利用gcc编译器编译(一般ubantu都会自带gcc的)没有的话安装一个吧

sudo apt-get  build-depgcc
sudo apt-get  install  build-essential

两个都可以实现,然后编译输出

gcc hello.c
./a.out

可以看到函数返回1,证明成功了,然后输入命令dmesg看系统日志,发现有helloworld!

NICE!!!!快乐肥宅成功实现了系统调用!

下面是我之前用的内核版本4.4.4,编译器说啥不支持这系列版本的从4.4.0到4.4.20都不支持。。。。。

没办法就换成了4.16.8

第一次写博客,有写的不好的地方可以留言,但我不一定会虚心接受(哈哈,开玩笑的),也算对linux操作系统有了更多的认识了吧,挺感谢老师提供的这次机会,让我们有机会自己动手感受操作系统的一些特点和功能,不得不说受益匪浅!

猜你喜欢

转载自blog.csdn.net/weixin_39478524/article/details/80377901