用UBuntu虚拟机添加系统调用(内核4.10.14版本)
第一次写博客,哈哈哈,每次总感觉,CSDN就是一个大牛云集的地方,觉得怎么说呢,就是写博客是不可能 写博客了,这辈子都不能写博客,也就在这里查查资料,膜一波大牛过过程序媛的日子这样子,直到操作系统老师布置下来这个作业,然后建议我们的提交方式可以写一个博客,给自己留一个纪念,并不是单纯每次都局限于提交课程报告这样子,才开始有点儿跃跃欲试。刚布置作业的时候,觉得就是很简单啊,也就把内核跑一遍、表里面加入命令、vim编写文件执行就这样吧,说起来容易啊,对于新手来说,简直就是闭着眼睛抓螃蟹——心里一团糟,手上一团泥。来记录一下,我从接触虚拟机到简单实现系统调用的添加的全过程吧。(满满的都是泪 哭唧唧.JPG)
首先,大家在网上下载好VMware workstation(可将多个操作系统作为虚拟机包括 Linux 或 Windows 虚拟机,在单台 PC 上运行的软件)和ubuntu,网上有很多资源,大家可以凭喜好*下载,这里给大家贴一下我用的,省的大家到处甄选(叫我小仙女巴拉巴拉)
链接:点击打开链接密码:mgdb
自己搜索教程创建虚拟机,这样就把前期工作准备好了,然后呢就开始准备好久好久盯着你的小可爱电脑吧。
其实主要实现调价系统调用也就是以下 步:
1、下载linux内核以及解压缩到/usr/src文件目录下。建议大家可以去官网下载,选择最新的、稳定的版本。我选择的是4.10.14版本的点击打开链接。
建议大家还是可以装一下VMware workstation界面下虚拟机子目录的VMware Tools的,这个工具可以实现Windows和虚拟机环境下内容的相互复制粘贴,还可以实现双方文件的共享,挺好的工具啦
然后就是把Windows界面下下载的内核代码移动到ubuntu的文件夹里,这里也可以直接解压。解压完成,ctshift+T调出虚拟机终端,使用移动命令mv+初始目录及文件名+目的目录,实现将解压好的内核代码移动到/usr/src里面,接下来的命令都是在/usr/src/linux-4.10.14目录下实现的。
2、下载编译过程中的编译依赖软件包,此步非常重要。
一般编译内核所需要的依赖项有以下一些:
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
具体的还是建议大家都下载,虽然有的显得多余,但是它们都很小,不占用很大的内存。大家可以参考这篇博客,做出了一些总结,大家可以有选择性的进行安装。https://blog.csdn.net/klarclm/article/details/8561197
3、安装完所需的依赖项,就要开始修改内核代码了。主要有三个步骤:
①在我们的内核代码目录下,找到/arch/x86/entry/syscalls/syscall_64.tbl //用来设置系统调用号,如果是32位就用syscall_32.tbl。
加入系统调用号。我加入的是332命令行,控制输出hellolinux的函数。
②接着在虚拟机中找到,/usr/src/linux-4.10.14/include/linux/syscalls.h //用来增加系统调用的头文件
加入函数声明,这里切记加在#endif命令的前面,否则编译的时候一定会出现错误的。我刚开始的时候咩有注意,失败了好几次,而且每次都不知道问题出在哪里,想想都是泪啊。
③最后一步,打开usr/src/linux-4.10.14/kernel/sys.c//用来定义系统调用
加入系统调用的定义。至此,内核的编辑已经完成。
4、编译内核。在终端上输入cd /usr/src/linux-4.10.14,将操作转移到usr/src/linux-4.10.14下,并获得管理员权限
sudo make menuconfig //进入menuconfig界面
sudo make //或者是sudo make -j4 (4核编译)编译内核代码
sudo make modules_install //编译完成之后就是安装一些驱动和功能
sudo make install //把内核安装到系统中
①输入第一个sudo make menuconfig 命令之后进入menuconfig ,用键盘上的← →选择save,点击Enter
第二个界面选择OK,继续Enter
第三个界面选择Exit,点击Enter,返回到第一个界面Exit即可。
这些都完成之后,就可以进入漫长的内核编译过程了。
② 编译的时候,可以选择sudo make命令,然后等待1-2个小时不等,没想到吧,惊不惊喜,意不意外。哈哈哈,当然机器好的话,可以选择sudo make-j4命令,将作业的CPU数目增加到4个,具体要看自己电脑支不支持这么工作。Windows下,在电脑桌面下方的任务栏上右击,选择资源管理器,点击性能按钮,在CPU使用记录中有四个正方形窗口,有的电脑只有两个小窗口,理论上,四个小窗口是四核的CPU。如果支持的话,就可以有效的缩短编译时间。
没有任何红色提示和Error就是编译顺利通过。
③编译完成之后,执行第三步的命令,就是安装一些驱动和功能。
④内核安装到系统中。
5、重启虚拟机。(非常重要,一定要重启)
有的伙伴内核编译之后可能出现无法重启的问题,可以参考一下这篇博客
http://blog.csdn.net/Gavin_dinggengjia/article/details/6321951
重启之后在选择界面上选择第二个Ubantu高级选项
6、安装vim编辑器,测试代码。
sudo apt-get install vim-gtk
在你的home主文件目录下创建.c文件,具体的方法,可以参照这一篇博客
https://blog.csdn.net/yuechuxuan/article/details/69989320
对于你新建的test.c文件,执行下面命令,
vim hello.c
按照上述博客的方法,插入你自己的测试代码
long int a=sycall(332)就是添加你在第3步加入的hello linux代码的调用,332就是你在第三步命令行的地址。
然后利用gcc编译器编译(一般ubantu都会自带gcc的)没有的话,就调用下方命令安装一个。
sudo apt-get build-depgcc
sudo apt-get install build-essential
如果安装成功,就可以执行编译
gcc hello.c
./a.out
输入gcc hello.c回车执行,而后输入。./a.out输出
可以看到函数返回1,证明成功了
然后输入命令dmesg看系统日志,Bingo!看到你在第三步写入的代码hello,linux标志着你整个过程彻底成功,可以尽情的开心了!
这次的操作系统那个作业呢,看起来就很简单,但事实上真的是一个折磨人的过程,我大大小小算是弄了三次,创建了两个虚拟机,每次的错误都是因为马马虎虎,不够细心造成。总之,做完这个作业,我真的觉得获益匪浅,在这个过程中,会不断出现E的提示,报错,每次自己都要冷静分析,查阅前人的博客、文献,找到解决方法。同时呢,虽然虚拟机虐我千百遍,但是我依旧待它如初恋,谁让我爱上了终端操作的感觉了呢!希望所有接触ubuntu虚拟机的小可爱都能一次成功,没有error哦!