欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-03 22:27:16
...

  本人第一次写博客,没想到奉献给了操作系统的实习作业,老师要求我们自己在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                                         //定义系统调用

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

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


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

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


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

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

有细心的小白可能会发现为什么这里是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界面

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

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

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

sudo make -j4 

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

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

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

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

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

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

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

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

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

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

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

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

sudo apt-get install vim-gtk

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

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

vim hello.c

打开之后输入测试代码

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

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

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

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

gcc hello.c
./a.out

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

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

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

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

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

没办法就换成了4.16.8


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

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

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

相关标签: ubantu