在上一期中,我们介绍了Linux内核的源码结构,这一期我们介绍Linux内核编程环境,首先介绍的是Linux内核的编译方法。
一、Linux内核编译方法
本期中我们以Linux 4.19.94版内核来介绍内核编译的方法和流程。
首先,运行命令:
wgethttps://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.94.tar.xz
下载Linux内核4.19.94版的压缩包。https://cdn.kernel.org这个网站建立了Linux内核源码的档案馆,保存了Linux内核的主线版本和长期维护版本的最新源码以及更改历史等有用信息。
然后,运行命令:
tar xflinux-4.19.94.tar.xz
解压压缩包,得到内核目录linux-4.19.94。
进入内核目录,我们可以看到如下目录结构:
关于各个文件和文件夹的主要功能在上几期中已经介绍过了。其中Kconfig这个文件主要用来配置内核,它就是各种配置界面的源文件,内核的配置工具读取各个Kconfig文件,生成配置界面供开发人员配置内核,最后生成配置文件 .config[1]。
Linux提供了不同的配置选择界面,通过使用配置选择界面可以选择是否将某一模块编译入内核以及是否将代码编译为在需要时可动态插入到内核的代码。有config、menuconfig、xconfig和oldconfig等,推荐使用menuconfig。其中make config 提供基于文本的最为传统的配置界面;make menuconfig提供基于文本菜单的配置界面,需要安装ncurse ;make xconfig 提供基于QT的图形配置界面,要求安装QT软件包;makeoldconfig 以现有的.config文件为基础来更新当前配置[2]。运行make menuconfig命令,可以得到如下图形选择界面:
在这个界面中展示了许多选项和子目录,选中子目录按回车可以进入子目录菜单。进入子目录后一般有三种选项,选项的含义为:
(1)< * >或[*]:表示将该功能编译进内核;
(2)[ ]:表示不将该功能编译进内核;
(3)[M]:表示将该功能编译成在需要时动态插入到内核的代码。用户根据需要进行配置[3]。
改完之后退出保存修改。Makefile 可以说是编译代码的文件,它根据make menuconfig生成的.config宏和编译工具及内核源码来生成zImage二进制的镜像[4]。
然后运行命令:
sudomake -j8
sudomake -j8 modules_install
sudo make -j8 install
上面三步分别完成了内核的编译、内核模块的编译安装和内核的安装,-j8表示用8个线程编译,可以加快编译速度,不同的机器可能支持不同的最佳编译线程数目。
安装完之后可以打开/boot/grub/grub.cfg搜索4.19.94,如果安装成功可以看到启动项中包含了linux-4.19.94启动项:
安装完成之后重启系统,输入uname -a,如果内核版本为4.19.94就说明成功了。
在内核代码中可以通过以下方法来打印DEBUG日志信息。
printk(KERNDEBUG "%s %s %d ",__ FILE __ , __ FUNCTION __ , __ LINE __ )
其中KERNDEBUG为日志级别,常用的日志级别有KERNINFO(提示信息)、KERNNOTICE(正常但重要的信息)、KERNWARNING(警告信息)和KERNERR(错误信息等)[5]。双引号之间的信息为打印的信息,而_ FILE __ 、__ FUNCTION __ 、__ LINE __则用来对代码进行跟踪调试,以显示代码所在的文件名、函数名和行数。
二、结语
本期我们介绍了Linux内核的编译方法,下一期中我们将通过一个实例介绍如何向内核中增加一个新的模块。
参考文献
[1]https://blog.csdn.net/u011425939/article/details/80472324
[2]http://www.mamicode.com/info-detail-1414999.html
[3]https://blog.csdn.net/lonnox/article/details/79506142
[4]https://blog.csdn.net/tiger15605353603/article/details/81323848
[5]https://blog.csdn.net/yuan892173701/article/details/7788208
[6]https://www.cnblogs.com/lifexy/p/7993136.html