ubuntu16.04系统下的kernel 4.10的内核编译以及新增系统调用

1.下载编译过程中的所需的软件依赖包

开始的开始,你需要你的系统存储空间大于30G,不然等着编译过程中存储空间爆炸吧!!!反正我第一次是被爆掉了。难过

首先下载编译过程中的编译依赖软件包,此步非常重要。

一般的内核编译依赖软件包主要有以下几个:

libncurses5-dev :主要是在make menuconfig时能够出现图形化的选择菜单所依赖的的库

libssl-dev : openssl的依赖包

build-essential:建立debian软件包的工具

openssl :涉及到系统安全的编译过程中的相关程序的依赖库

zlibc :允许运行中的文件能够实现解压缩数据文件的一个工具

minizip :是一个轻量级的支持库,能够支持压缩、提取、查看和操作ZIP文件。该软件包包括minizip和miniunzip工具

libidn11-dev : 涉及到系统帮助等文档以及软件库等信息的一个软件包

libidn11 :同上,ubuntu好像自带了惊讶

以上是本人在linux软件网站上粗略看了之后翻译过来的,可能中间有错误之处,欢迎读者给出修改意见。如果想自己看相关软件包的介绍,可以打开链接https://pkgs.org/,在里面搜索软件,然后进入各系统版本的子网页自己看软件功能说明。

以上软件建议每个安装下来,虽然有几个软件包在目前内核编译的过程中比较多余,但是安装所需的空间根本不大。

软件安装命令:

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

如过安装过程中按Y嫌麻烦,可以在安装命令后面加上个-y参数

2.下载linux内核以及解压缩到/usr/src文件目录下

下载linux内核,官网https://www.kernel.org/,下载最新的稳定版本,这里我选择的是4.10.14版本。

我的kernel 4.10.14的分享网址:https://pan.baidu.com/s/1hsii4dQ

下载完之后将其移动到系统的/usr/src文件下,进入/usr/src目录,使用tar -xvf  压缩文件名  进行解压缩,进行过后,会发现/usr/src目录下多了和压缩文件名称一样的一个文件目录,然后进入这个目录,接下来的步骤都在这个文件夹下操作。

3.修改系统调用相关源代码,实现系统调用

1)用vim或者gedit文本编辑器对kernel/sys.c文件进行编辑

加入linkage.h头文件


加入系统调用函数,记住,系统调用函数一定要绕过条件编译,可以从最后一行往前找,找到如图所示位置。


2)使用文本编辑器gedit或者vim 对arch/x86/include/asm/syscalls.h进行编辑,加入系统调用函数声明,如图:


3)用vim或者gedit文本编辑器对arch/x86/entry/syscalls/syscall_32.tbl文件进行编辑,加入系统函数代号,在223号调用处加入如下内容:


4.编译内核以及安装内核

依次使用命令(建议用su root切换到超级用户,这样不用每次前面加sudo了。)

sudo make mrproper
sudo make clean
sudo make menuconfig
实现完全干净的第一次编译,其中mrproper为清除编译过程中产生的所有中间文件,clean为清除上一次产生的编译中间文件,在menuconfig中出现选择的图形化界面后,直接按右方向键选择到exit退出,退出提示中选择保存,实现内核的默认配置。

接下来到了激动人心的时刻了。可以使用make命令了,等等,你要提高编译速度,可以嘛!

使用lscpu命令看看你的cpu支持几个线程。如果在虚拟机中,可以在配置中调整cpu的个数,然后重启,进入到当前的/usr/src/linux-4.10.14文件夹下

如果lscpu显示有8个,那么你的电脑牛逼轰轰啊!绝逼是个游戏本,就像本人的。

然后本人用了

sudo make -j8
吐舌头
使用八个线程同时运行编译,经过本人测试,使用多线程在编译桌面版的内核中没问题,但是在编译openwrt内核的过程中有问题,这里要注意一下。

编译完成后使用

sudo make modules_install
sudo make install
依次安装内核模块和内核

5.加载内核,实现系统调用

重新启动系统,如果是虚拟机的话记得重启进入BIOS界面之前一定要点击鼠标进入虚拟机的界面实现键盘捕获。在重启开机界面一直按shift键,选择高级选项,进入内核选择加载界面,选择自己编译的内核的正常模式。

进入内核选择模式,选择自己编译的内核:


进入系统后,建立如下的c语言程序,编译。

#include <stdio.h>
#include <stdlib.h>
int main() {
    syscall(223,1);
    return 0;
}
其中syscall函数的第一个参数代表的就是系统函数的代号,我们的为223(之前设置的),后一个为传给223号函数(sys_helloworld)的参数

运行之前,使用dmesg命令观看,暂时没用打印结果:

运行之后,出现结果:

到此,一个给内核编译并且添加系统调用的步骤完成了。但是,真的完了吗?->_-> 还没呢,这或许只是内核战记的开始。

接下来还要研究研究menuconfig的选项啊!

openwrt路由系统的编译啊!

内核里面的各个文件夹是干嘛的以及内核文件的说明文档啊!

总之,朋友别急,内核战记才刚刚开始。大笑


猜你喜欢

转载自blog.csdn.net/xiaobai__lee/article/details/72048829