一、导言
前几天操作系统课程布置了一个给linux添加系统调用的作业。
对于我一个刚安装完双系统的小白来说那可真是一头雾水,在老师的逼迫和鼓励下,查找了各种各样的资料,学习了许许多多的博客,经历了种种错误和绝望之后,终于完成了!
本文章通过三个部分来分享:
1.环境和准备
2.详细步骤及常见错误
3.心得
二、增加系统调用
(1)环境和准备
1.环境
VMware Workstation14虚拟机下 Ubuntu (版本18.04.2)(当然也可以使用双系统)
内核版本 4.18.0-15
2.准备
下载一个新的内核,百度各大网站,CSDN等都可以下载;
这里使用的是linux-4.16.8.tar.xz
注意:请保证你的linux有足够的存储空间!
我在编译内核前剩余70G,全部完成后剩余47.5G,下面是内核文件夹大小作为参考。
所以请分配足够的空间
惨痛的教训,我在双系统编译内核快要完成时显示内存不足,导致我又在虚拟机上重新做了一遍,费时费力。
下面我们正式开始我们的步骤。
(2)详细步骤和常见错误
第一步:获取root权限并下载完成相应的配置
首先要熟悉终端的操作,终端(那个黑色的可以输入各种命令的黑框框),可以按ctrl+alt+T打开,也可以右键桌面打开,后续工作大部分都要在这里面完成。
1.获取root权限,即获取管理员权限
没有管理员权限无法完成移动文件等诸多操作。
打开终端后输入sudo su
,然后输入用户密码,即可获得权限。
2.下载完成相应配置
linux中大多采用sudo apt-get install+文件名的命令下载各种需要的编译文件,库文件
按图中例子依次下载linux-source build-essential kernel-package libncurses5-dev等,如果后面有缺可以补充下载。
第二步:移动内核并解压
1.移动内核到/usr/src/文件夹里
因为没有管理员权限不能直接移动所以要在终端里用指令移动;
用mv语句:sudo mv /home/himawari/下载/linux-4.16.8.tar.xz /usr/src/
前面为移动的内核文件路径,后面为要移动到的路径。
注意:注意千万语句中的空格,否则会出现错误
如果mv语句曾经像我一样实在输不对,可以采用sudo nautilus
命令,打开一个具有权限的资源管理器,找到内核文件,就可以拷贝到/usr/src/里了。
小tips:在终端里用方向键上下键可以选择历史命令,这样可以快捷输入之前输入的命令,效率提高了很多。
2.解压内核文件
先用cd语句移动到/usr/src目录:cd /usr/src
cd+路径即移动到指定目录下。
对于我的内核的xz后缀使用命令tar -Jxvf linux-4.16.8.tar.xz
解压
对于其他格式请参考https://www.cnblogs.com/midiyu/p/7875462.html选择使用命令
解压成功后进入下一步
第三步:编写加入新的系统函数
1.进入解压后的文件夹并安装vim编辑器
cd /usr/src/linux-4.16.8/kernel
下载安装vim编辑器
sudo apt-get install vim
完成后即可打开各种文件并进行编辑。
2.编写加入新函数
在之前进入的/usr/src/linux-4.16.8//kernel路径下输入命令
vim sys.c
注意:vim编辑器常用的几个操作:
i 进入编辑模式
esc 退出编辑
:wq 保存退出
:q 不保存退出
我们在编辑器末尾添加函数
asmlinkage long hellohelloworld(void){
printk("Honma Himawari");
return 2434;
}
保存并退出
第四步:添加声明
进入cd /usr/src/linux-4.16.8/arch/x86/include/asm/
输入vim syscalls.h
在文件中插入asmlinkage long hellohelloworld(void);
保存并退出
第五步:添加系统调用id
进入cd /usr/src/linux-4.16.8/arch/x86/entry/syscalls
输入vim syscall_64.tbl
在编辑器中添加333 64 helloworld hellohelloworld
保存并退出
第六步:配置内核
一、编译内核
1.进入路径
cd /usr/src/linux-4.16.8
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
3.执行命令
清除无用文件
sudo make mrproper
sudo make clean
配置内核
sudo make menuconfig
注意:这里可能会碰到错误
解决办法
sudo apt-get install bison
解决办法
sudo apt-get install flex
总结:过程中可能会碰到缺少库的错误,缺什么下什么就好了
4.采用默认设置
成功进入菜单
在这个菜单中采用默认设置,Save->OK->然后Exit
5.开始编译内核
使用命令sudo make -j4
-jN为告诉处理器同时运行N个编译程序。
我的4核心cpu可以采用-j4,理论上数字不能超过处理器核心的两倍。
因为编译时间漫长,这会大大影响编译速度。
开始漫长编译
过程中有些地方卡了很久也是正常现象…只要没死机~
如果内存不够就会出现我之前的情况:设备上没有空间(都是泪啊!)
看别人好像一般都编译了2~3小时,但我只用了50分钟…根据个人而定把
二、安装内核
1.输入命令
输入
sudo make modules_install
sudo make install
这样就接近成功啦!
第七步:调试
一、配置grub引导
输入命令sudo update-grub2
作用是启动时,引导程序在对计算机系统初始化后,把操作系统的核心部分程序装入存储
让我们可以在引导界面用grub切换内核
二、重启ubuntu
1.Ubuntu图标在正中央,小圆圈滚动加载时,长按住shift,重启后就会出现grub界面
选择Ubuntu高级选项
选择新的内核启动
注意:这里也可能出现错误
错误:
然后无法启动,当时我都以为要前功尽弃了,但根据那个Out of memory找到了解决办法。
解决办法:在VMware中将虚拟机内存从2G改到4G,就可以成功进入了
三、测试
1.检验内核版本
在终端中输入命令cat /proc/version
看到内核版本已经变为4.16.8
2.编写程序
进入cd /home/himawari/桌面
在桌面创建c文件touch 12.c
编辑c文件vim 12.c
输入代码
#include<stdio.h>
#include<sys/syscall.h>
#include<linux/kernel.h>
#include<unistd.h>
int main()
{
long int a=syscall(333);
printf("hellohelloworld return %ld\n",a);
return 0;
}
保存并退出
3.编译程序
接下来是激动人心的时刻,用gcc编译编辑的c文件
用命令gcc 12.c
输出a./a.out
当你发现函数返回的不是-1而是你规定的数字时,证明你的系统调用就成功啦!!!!
是2434!
是彩虹社!(x
三、心得
这两天的摸索和努力,中间虽然经历了种种的困难和绝望(mv命令不断错误,解压时命令出错,编译内核时内存不够,最终更换内核后无法启动……)
但成功后真的是发自内心的喜悦。
发现自己从一个不知道系统调用,甚至不知道终端,害怕自己用不好那些专业的linux内部命令的小白,到熟练地运用各种命令进行下载、进入目录、移动文件,创建文本等操作,大大加深了自己对于linux系统的理解。
所谓前人栽树,在此特别感谢前届学长的博客以及他本人的大力鼓励和支持!
https://blog.csdn.net/qq_41175905/article/details/80529245
读者也可以作为参考,我也在其基础上进行了很多的改善和补充。
这也是我第一次写博客,如果有排版问题,或是文章阅读上的困难敬请谅解。
本文旨在帮助像我一样的linux小白在遇到相同问题时能找到解决办法,如果有没看懂的地方或是遇到了问题,或是一些我没说明的地方有大神能给出建议,以及有对此博客的建议,都欢迎在下方留言
同样,如果还有不明白的问题或是有想交流讨论的问题欢迎加好友讨论。
联系方式:QQ41096378(备注CSDN)