uImage编译
‘壹’ 【boot】linux Kernel 镜像的生成以及加载
Linux Kernel 镜像格式包括:vmlinux、Image、zImage、bzImage、uImage、xipImage。vmlinux是原始可引导且未压缩的内核文件,由用户编译得到,实质是 ELF 格式。Image是经过obj处理的原始二进制数据内核代码,未压缩。zImage是经过gzip压缩的vmlinux加上解压代码,适用于NAND Flash。bzImage是使用不同压缩算法的压缩内核映像,压缩率更高,同样适用于NAND Flash。uImage是用于u-boot的镜像文件,比zImage多一个头部信息。xipImage则存放在NOR Flash中,直接运行无需复制到SDRAM。
内核镜像的产生过程包括:首先生成可执行的vmlinux文件;然后通过obj处理成Image,变小但未压缩;接着使用gzip压缩Image生成compress/vmlinux;最后再使用obj处理compress/vmlinux生成zImage,压缩比约为2:1。
Linux内核镜像的加载过程包括加载文件头、内存布局、分阶段加载内核镜像、实模式和保护模式下内核加载。实模式下加载boot/setup.bin,进行硬件初始化并跳转到main()函数开始执行。保护模式下加载boot/vmlinux.bin,解压缩并初始化页表,调用init/main.c:start_kernel()函数。
Linux内核镜像格式多样,根据硬件类型和存储设备选择合适的镜像格式进行加载。加载过程包括硬件初始化、内存布局设定、分阶段加载内核镜像,最后实模式和保护模式下执行内核。
使用make命令如“make zImage”可以生成zImage镜像,相关代码在arch/arm/Makefile中。
内核加载流程包含加载文件头和末尾的CRC校验码,以及在实模式和保护模式下分别执行boot/setup.bin和boot/vmlinux.bin。实模式下执行setup.bin进行硬件初始化,然后跳转到main()函数执行。保护模式下加载vmlinux.bin,解压缩后初始化页表,调用start_kernel()函数启动内核。
‘贰’ arm linux 核心 编译出错 make uImage 编译工具是开发板光盘现成的PATH环境变量设置
参照开发板手册编译:
1、make xxx_defconfig
2、make menuconfig
3、make uImage
‘叁’ 如何使用从linux内核编译出来的image文件
嵌入式内核镜像:vmlinux、vmlinuz、vmlinux.bin、zimage、bzimage、uImage 之间的差异
在本教程中,我们将深入探讨各种可用的内核映像,了解它们各自的特点以及在不同场景下的应用。
内核是Linux系统的核心,负责提供用户界面、连接应用程序与底层硬件、管理内存、进程、设备驱动和系统安全等任务。内核映像是包含内核代码和其他组件的二进制文件,不同格式的映像适用于不同的硬件架构和引导加载程序。
常见的内核映像格式包括vmlinux、vmlinuz、vmlinux.bin、zimage、bzimage和uImage。每种映像都有其特定用途和适用条件,以下是它们的详细介绍:
1. VMLinux:原始且未压缩的内核映像,包含完整且未修改的内核代码以及调试符号。主要用于开发、调试和分析内核,是生成vmlinuz的中间步骤。
2. Vmlinuz:压缩后的vmlinux文件,用于引导Linux操作系统。压缩使用gzip算法,减小文件大小,优化启动效率和内存使用。
3. VMLINUX.bin:在Linux内核源代码编译过程中生成的未压缩二进制映像,包含整个编译的内核代码和用于调试分析的附加信息。不直接执行,主要用于理解和分析Linux内核行为。
4. Zimage:zImage是vmlinux经过gzip压缩后的文件格式。它解决了旧引导加载程序无法处理大型压缩内核映像的限制。使用LZ77压缩算法优化速度和压缩比。
5. Bzimage:Linux引导加载程序用于引导过程加载和初始化内核的压缩内核映像文件。通过gzip压缩vmlinux文件,压缩后大小通常在512KB以下。包含引导加载程序标头和压缩内核映像。
6. UImage:U-boot专用映像文件,由zImage前的长度为0x40的“头”提供映像类型、加载位置、生成时间、大小等信息。从uImage的0x40位置开始执行与直接执行zImage无差异。
选择正确的内核映像格式取决于多种因素,如用例、硬件架构、引导加载程序兼容性和压缩/优化要求。
编译一个压缩后的内核镜像通常涉及以下步骤:
1. 链接生成未压缩的vmlinux和Image文件。
2. 利用OBJCOPY工具处理EFL文件,去除符号和重定位信息,生成最终的二进制文件。
在编译过程中,通常会先生成未压缩的vmlinux或Image文件,然后生成压缩后的vmlinux或zImage文件。
一般编译器链接生成的文件为ELF格式的可执行文件,内核则经过LD生成vmlinux,使用OBJCOPY工具处理去除符号和重定位信息,生成最终的二进制文件。当需要进行内核调试时,vmlinux文件中的符号信息至关重要。