您的位置:首页 > 其它

保姆级教程:在Ubuntu19.10下如何编译内核添加系统调用以及问题汇总(a start job问题)

2020-04-25 07:26 771 查看

前情摘要

老师布置的完成内核编译作业,兴致勃勃的我看了几个博主写的文章,兴奋的以为没有问题,没想到,这才是历练的开始。
Ubuntu19.10里会出现许许多多奇怪的问题,在看了50多篇博文以及不断的百度之后,我终于搞定了,希望能给后来的朋友一点经验,不至于向我一样啥都查不到。

VM中安装Ubuntun19.10

简单的下载不说,我是从阿里镜像源下载的Ubuntun 19.10

注意: 第一个坑出来了,安装部分,由于将要进行的内核编译非常占用系统资源而且花费时间,个人建议,先在windows电脑内,打开任务管理器——性能(有些需要先点一下详细信息)查看你的电脑cpu逻辑处理器数量。

这个逻辑处理器对后面虚拟机配置很有用,记好,我的电脑是四逻辑处理器的
虚拟机配置页面:

建议40G,楼主20G不够用。

内存当然能大则大,最小4GB,不然后面会报错

楼主选择的是2核2核心,刚好可以榨干物理机的cpu。也就是说,要让你的逻辑处理器数量=处理器内核总数
另外:一定记得先把网络适配器删除,Ubuntu安装的时候比较坑,会自动联网更新,你不删除,安装会比较慢,当然断网也可以

配置虚拟机的坑大概就是这些,接下来开始使用。

使用前配置

安装vm tools

在使用中,vm tools是个很好的工具,但是Ubuntu里不像CentOS里直接就装好,所以需要手动安装一下

在左上角我们可以发现,安装VM Tools是灰色的,怎么办呢?

到虚拟机——设置 (一定要在虚拟机关机状态) 将CD/DVD、CD/DVD 2、软盘全部修改为自动



如图所示

确定——再开机,你会发现可以安装了。


开始安装

把文件拷贝到桌面上,然后提取


鼠标右键,提取到此处

打开提取后的文件夹

进入这个页面,然后在里面打开终端
输入命令

./vmware-install.pl


执行,只有第一个输入输入y,其余一路Enter就好

出现Enjoy 就是好了

重启虚拟机,就可以用了

修复无法退格,上下左右为ABCD问题

因为Ubuntu系统里面的vi比较坑,会无法退格(就是按Backspace)且上下左右键会出来ABCD,网上普遍的解决方法是删除vi再安装vim,但是由于我们的更新源还没有切换,下载速度会比较慢,所以楼主推荐另外一种方法进行操作:
先在桌面打开终端

sudo su

进入root用户

编辑/etc/vim/vimrc.tiny文件

vi /etc/vim/vimrc.tiny

在这个地方一定要注意,先用上下左右移到楼主光标位置 (千万不要按i进入文本编辑模式!!!)

然后再按 i 进入文本编辑模式。加入 no ,变成nocompatible。然后立马按esc,再使用方向键移动到这一行的末尾,再按 i 进入文本编辑模式,回车一下另起一行,加入

set backspace = 2

使其变为


退出esc+:wq保存,这样就好了

更换阿里源

不用退出,继续输入

cd /etc/apt
ls

可以看到有一个sources.list文件

我们先备份文件

sudo cp sources.list sources.list.old

然后,我们就将原来的文件删除

rm -rf sources.list

新建一个文件

touch sources.list

打开文件

vi sources.list

按 i 开始编辑文本
将阿里源文件复制粘贴进去

deb http://mirrors.aliyun.com/ubuntu/ eoan main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ eoan main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ eoan-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ eoan-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ eoan-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ eoan-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ eoan-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ eoan-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ eoan-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ eoan-proposed main restricted universe multiverse

退出保存,完成
此时,记得要将网络适配器添加回来,就是在虚拟机选项卡——设置——添加——网络适配器
虚拟机会自动进行配置,之后再执行命令

sudo apt-get update


这样就成功了

内核编译前准备工作

安装vim

vim是个好用的编译器,更换源成功后,我们就开始使用好用的编译器
执行命令

sudo apt-get install vim


只需要输入一次== y ==就静待安装成功。

安装libelf-dev、bison、flex、libssl-dev、libncurses5-dev这一串软件来配置内核

sudo apt-get install bison flex libssl-dev libncurses5-dev libelf-dev

这一个命令就ok了,如果有安装不成功的现象,就把它拆开,一个一个安装。

安装make用以编译内核

sudo apt-get install make

将下载好的内核拷入虚拟机

两种方法,一种用vm tools也就是直接拖进去,但是楼主的电脑不知道为啥就是不行,所以楼主采用第二种
在虚拟机——设置——选项——共享文件夹——总是启用——添加

跟着提示步骤一步步的将文件添加进来
共享文件在Ubuntu中的这个位置

Computer——mnt——hgfs——共享——内核文件

同样,我们将这个文件拷贝到桌面

楼主发现不能直接复制,然后去真正的桌面粘贴,只能在文件夹目录里粘贴,小白注意。
准备工作就绪

内核编译

先将压缩文件解压到内核根目录下
在桌面用鼠标右键打开终端
输入命令

sudo su

进入root 用户,再ls一下

ls

看一下压缩包在不在这里

可以看见压缩包就在这里,我的是linux-5.5.13,所以输入命令

tar -xvf linux-5.5.13 -C /usr/src

这样就可以解压到 /usr/src目录之下了
接下来,我们进入 这个目录之下

cd /usr/src

同样 ls一下,看一下解压后的文件在不在

ls


打开解压的文件夹,也就是到达刚刚解压好的内核的根目录下

cd linux-5.5.13


这样,就可以愉快的开始下面的添加系统调用三部曲了。

分配系统调用号

输入命令

vim arch/x86/entry/syscalls/syscall_64.tbl


这里注意,一定要在那个x32上方添加你自己的东西,千万不要在第一个绿色那个上面添加
楼主添加好以后是这样的

楼主添加的是436 64 helloworld __x64_sys_helloworld,我看别的博主写的说第二位只能添加64 和 common楼主添加的就是64,后面那个保持格式就好,有的版本是sys_ 反正,你只要知道,保持队列整齐和一致就问题不大。

退出,保存

声明系统调用服务

输入命令

vim include/linux/syscalls.h

之后按键盘上 Pg Dn,在大概1244行的地方,一定注意,要添加的位置,位置错了,很难编译正确

*
* Not a real system call, but a placeholder for syscalls which are
* not implemented -- see kernel/sys_ni.c
*/
asmlinkage long sys_ni_syscall(void);

在这个下面添加

asmlinkage long sys_helloworld(void);

变成这样

最好放大看一下

退出,保存

添加系统服务代码

输入命令

vim kernel/sys.c

这个添加位置就在最下面就可以
添加内容

SYSCALL_DEFINE0(helloworld){
printk("Hello world!\n");
return 1;
}

注意是return 1,一会儿可以检测是否调用成功
退出,保存

开始内核编译工作

在此位置

先输入命令

make mrproper

进行文件清理
再输入

make menuconfig

进行配置,其实对于这个来说,配不配置无所谓
但是可以加入你想要的内核名
一定要把你的虚拟机全屏或者放大,不然会报错!!!


进入General setup

local version,输入你想要的名字

然后ok,用键盘左右方向键,先save再ok,之后不断exit直到出去,即回到终端

编译(都要在root用户下进行)

内核编译

先输入命令

make oldconfig

不断enter即可(有些电脑可能不用,会出现No change to .config,这样就不用管了,直接开始下一步
之后输入

make -j4

楼主是4,是因为楼主的虚拟机内核为4,这个你看自己,如果你是6核,就输入 -j6 8核就是 -j8 以此类推。
接下来就是等待,你可以看到你的cpu占用状态可以达到130%,听着电脑的风扇声音,静静的等待。楼主4核一小时才可以完成,之前用单线程,足足用了三个小时,裂开。
当你出现如下图一样的情况,且没有报错(undefined之类的)

模块编译

输入命令

make modules_install

这个不太长,具体时间大概半个小时左右吧。
结果如下图所示

安装内核

输入命令

make install

这里会卡一下,不用担心,等着就好

等出现这个done的时候就是好了,也就是五分钟左右。

接着,我们要将这个内核更新到启动列表里
执行命令

update-grub2

重启

执行命令

reboot

vm可能会出现未响应,先别着急,等着。
系统重启后一般来说会进入你新创建的内核,如果没有,则在启动的时候狂按esc,然后进入高级选项,选择你的内核
选择你的内核后,大概率会出现如下情况:

这也是我看许多其他博主没有碰到的情况,即出现A start job is running for…
这个问题其实是swap分区交换出的问题,我们需要先重启虚拟机,进入原来内核,即在开机界面狂按esc

重启虚拟机

进入选项

选择原来内核,回车,等待系统启动。
进入系统后,我们直接进入终端,进入root用户
输入命令

sudo blkid


可以得到我们真实的swap分区的UUID,就是图片里的eeef561f-0f28-4ad3-bf19-6448c0cf9ad6复制下来。
再输入命令

sudo nano /etc/fstab

进入这个页面,进行替换,将页面内的UUID替换成我们刚才得到的(替换完一定要检查,是否对其,可以看那个ext4和swap哪里,上下是否对齐!

保存,退出。(楼主是按两下ESC然后再加上shift + x,再Y+enter离开的)
直接重启,不用选择,这个设置自动就是进入新的内核。

查看新内核是否成功进入

进入桌面后直接进入终端
输入命令

uname -r


可以看到,楼主这里已经成功进入自己编译的新内核,接下来看系统调用是否成功,先进入root用户,再创建一个测试文件
输入命令

sudo su
vim test.c

编辑测试代码

#include<stdio.h>
#include<linux/kernel.h>
#include<sys/syscall.h>
#include<unistd.h>

int main()
{
long int a = syscall(436); //这里输入你自己的系统调用号,楼主是436
printf("Hello, world ! return %ld\n" , a);
return 0;
}

接着使用gcc编译你的代码,如果没有安装gcc,则用apt-get install安装一下
输入命令

gcc test.c

他会生成一个a.out文件,我们执行就好,输入代码

./a.out


可以看到return值是1,成功!

后记

这是楼主经过三天的摸索和学习后得到的结果,仅供大家参考吧,楼主也欢迎各位和楼主讨论,如果有写的有问题的地方,还请大佬指出,毕竟楼主还只是个菜鸟,只不过碰巧喜欢计算机,喜欢探索,感谢各位的阅读。

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
梦天鲲 发布了1 篇原创文章 · 获赞 1 · 访问量 815 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: