linux内核——初探(内核配置和编译生成vmlinux,zImage,uImage文件及其内核安装)

Linux内核代码的组成

源码目录目录分析
/arch不同CPU架构下的核心代码。其中的每一个子目录都代表Linux支持的CPU架构
/block块设备通用函数
/crypto常见的加密算法的C语言实现代码,譬如crc32、md5、sha1等
/Documentation说明文档,对每个目录的具体作用进行说明/drivers内核中所有设备的驱动程序,其中的每一个子目录对应一种设备驱动
/firmware固件代码
/fsLinux支持的文件系统代码,及各种类型的文件的操作代码。每个子目录都代表Linux支持的一种文件系统类型
/include内核编译通用的头文件
/init内核编译通用的头文件
/init内核初始化的核心代码
/ipc内核中进程间的通信代码
/kernel内核的核心代码,此目录下实现了大多数Linux系统的内核函数。与处理器架构相关的内核代码在/kernel/$ARCH/kernel
/lib内核共用的函数库,与处理器架构相关的库在/kernel/$ARCH/lib
/mm内存管理代码,譬如页式存储管理内存的分配和释放等。与具体处理器架构相关的内存管理代码位于/arch/$ARCH/mm目录下
/net网络通信相关代码
/samples示例代码
/scripts用于内核配置的脚本文件,用于实现内核配置的图形界面
/security安全性相关的代码
/toolsLinux中的常用工具
/usr内核启动相关的代码
/virt内核虚拟机相关的代码

Linux内核配置和编译
1,工具链
根据相关的工具链安装好自己开发板的工具链(ACROSS_COMPILE).否则在配置编译内核时会找不到arm-linux-等交叉编译工具,而导致无法编译。工具链的安装可以参考我之前发表的交叉编译工具的安装:https://blog.csdn.net/weixin_38251305/article/details/104109723
2,配置内核就是决定需要编译的代码
3,编译内核就是生成可执行文件vmlinux,zimage和uImage的过程

Linux内核具有可制定的有点,具体的内核配置步骤如下:
1)清除临时文件,中间文件和配置文件

2)从www.kernel.org上下载Linux内核代码,




点击进入下一个界面,下拉找到linux内核源码压缩包

也可以在ubuntu下用命令: wget进行下载,如

3)我下的是linux-3.8.3版本的,然后拷贝到ubuntu目录下进行减压

4) 进入到减压后lnux内核文件的顶层(根)目录,执行make clean或make distclean,make rmclean进行清除相关做过的配置(前提:如果做过的一些配置想清除就执行这三个命令清除掉就好了)

如图,是我已经做过的配置然后编译产生了vmImage可执行文件,这时若我想重新配置里内核,我就会执行make distclean将之前做过的配置清除。如

在执行make distclean等清除命令时,可能要切换到root用户。
5)内核配置
<1>确定目标系统的硬件配置情况,比如CPU(处理器,可在内核文件目录arch/下查看)的类型,网卡的型号,所需支持的网络协议等。

如图,目录arch/下的各个 类型处理器。
<2>可使用如下命令之一进行配置内核:

注:当在Ubuntu下运行命令make menuconfig时可能会出错,如下   
* Unable to find the ncurses libraries or the
    * required header files.
    * ‘make menuconfig’ requires the ncurses libraries.
    * Install ncurses (ncurses-devel) and try again.
    make[1]: * [scripts/kconfig/dochecklxdialog] Error 1
    make: * [menuconfig] Error 2

解决办法是,安装相应的库,执行如下命令

$sudo apt-get install lncurses-dev
$sudo apt-get install libncurses5-dev

再运行make menuconfig时就可以了,如下图是成功运行跳出的配置界面

这里我推荐用make menuconfig配置内核


Make menuconfig有3种相应的选择:
Y--将该功能编译进内核
N--不将该功能编译进内核
M--将该功能编译成可以在需要时动态插入到内核中的模块
Make menuconfig工具菜单里如何选择配置内核的配置详解
https://blog.csdn.net/xuyuefei1988/article/details/8635539

除此外,运行make xconfig时可能也会出错,因为缺少一些qt相关的包,出错如下

解决办法:安装以下依赖库

sudo apt-get install kernel-packagesudo 
apt-get install build-essentialsudo
apt-get install libqt3-headers libqt3-mt-dev

安装完,再执行make xconfig就可以了。
<3>这里我选择用make menuconfig工具来进行内核的相关配置,配置完后选择Exit进行退出,如下:

当保持退出时,你所做的相关配置就会生效,此时这些配置会自动生成一个.config文件,如下

在内核文件顶层目录下运行:ls -a亦可查看到,如下

<4>清除配置的相关文件,make distclean

6)在第5)的内核配置完,在内核顶层文件里生成.config配置文件之后。因为要确保生成.config文件后编译内核才能生成相应的,vmlinux,zImage,uImage文件否则编译内核会因为缺少.config文件而报错,报错如下:

7)获取.config文件,.config文件可以由配置内核时生成,也可以从linux内核代码里提供的已有的.config获取;在内核目录 arch/arm/configs/下可以找到与你开发板的处理器型号相应的config(配置文件)文件,如下图

将里面的配置文件拷贝到顶层目录即可,若你的板子是其他处理器型的,不是arm处理器,你只需在/arch目录下找到相应的处理器文件,进入到相应的/configs目录下拷贝相对应的config文件即可。这里以arm处理器的s5pv210为例演示,如下

进入confis目录将相应的config 文件拷贝到顶层目录

拷贝成功如下

8)得到了.config后,还需要修改顶层的Makefile文件,否则会默认为x86平台,
需改的地方如下,打开Makefile文件


配置完Makefile文件就可以开始编译内核了;如图选择相应的编译方式进行内核的编译

我选择用,make zImage V=1;大V=1的作用:编译过程中会显示相应的编译信息,如下图


等漫长的编译完成后,如下是编译结果,vmlinux生成在目录arch/arm/boot/compressed/下,内核文件生成在目录 arch/arm/boot/下;如下图

到目录/arch/<CPU>/boot下查看生成的内核文件,打开对应目录查看 ,确实生成了相应的vmlinux ,zImage 文件我编译好的内核如下:

【注意】如果.config文件是由make menuconfig 等配置方式生成的,在运行make zImage 编译时不会出现 相关的配置选项信息。若是从内核提供中复制cp过来的 ,在运行make zImage 编译时会出现相关的配置选项信息。此时 根据自己的配置需求选择即可 。
【提示】

  • vmlinux是原始的,未经压缩的可执行文件
  • zImage是压缩的可执行文件:压缩vmlinux后,加上一个头,这个头由一些程序组成,这些程序是用来解压的。
  • uImage其实就是用于给uboot引导的zImage
    **9)编译内核模块 **
$make modules 

编译成功,如下

10)安装内核模块

$make modules_install

将编译好的内核模块从内核代码目录coopy 至/lib/modules下 。
编译成功,结果如下图

11)制作init ramdisk

init ramdisk 的解析https://blog.csdn.net/xys0610/article/details/52613149
在用命令mkinitrd 编译时,由于ubuntu 找不到命令mkinitrd, 因为ubunut下没有这个命令,取而代之的是mkinitramfs,使用mkinitramfs命令就可以,命令格式:

#将/lib/modules/下的内核模块3.8.3 编译成ramDisk文件 initrd.img.3.8.3
$mkinitramfs -o initrd.img.3.8.3  /lib/modules/3.8.3

3.8.3 是刚才编译生成的内核模块,在/lib/modules/下。

【补充】关于Ramdisk 的介绍

先介绍一下什么是RamDisk。RamDisk实际是从内存中划出一部分作为一个分区使用,换句话说,就是把内存一部分当做硬盘使用,你可以向里边存文件。那么为什么要用RamDisk呢?假设有几个文件要频繁的使用,你如果将它们加到内存当中,程序运行速度会大副提高,因为内存的读写速度远高于硬盘。况且内存价格低廉,一台PC有2G已不是什么新鲜事。划出部分内存提高整体性能不亚于更换新的CPU。何乐而不为呢?象WEB服务器这样的计算机,需要大量的读取和交换特定的文件,因此,在WEB服务器上建立RamDisk会大大提高网络读取速度。在进行内核编译时,需要进行制作initrd.img.在Fedora下面一般是用mkinitrd,而在Ubuntu/Debian下是用mkinitramfs.**

12) 安装内核(这里以x86平台为例,其他平台同理)

$cp arch/x86/boot/bzImage /boot/vmlinuz-$version 
$cp initrd.img.3.8.3  /boot/

** $version为编译的内核版本号**
** 再将生成initrd.img.3.8.3复制到 /boot/,作为新的initrd.img即可 **
然后修改/etc/grub.conf 或者 /etc/lilo.cong ,但是ubuntu下没有这两个配置文件,
RedHat的开机系统选择配置文件是/etc/grub.conf!!!!!后来查了查发现ubuntu11.10没有grub.conf文件取而代之的是/boot/grub/grub.cfg

以上便是内核的配置和编译过程,希望对你有帮助

  • 10
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值