vmlinux,zImage,bzImage,vmlinuz,uImage,关系

本文详细介绍了Linux内核的不同格式映像文件,包括vmlinux、zImage、bzImage、uImage和vmlinuz的区别及应用场景。同时讲解了initrd的作用,并提供了编译和制作这些映像文件的具体步骤。


本文转自   http://blog.youkuaiyun.com/maojudong/archive/2009/05/13/4178118.aspx

 


zImage和uImage的区别

 一、vmlinuz

vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。

vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage/boot/vmlinuz”产生。zImage适用于 小内核的情况,它的存在是为了向后的兼容性。

二是内核编译时通过命令make bzImage创建,然后通过:“cp/usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起 误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

二、initrd-x.x.x.img

initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd 映象文件。这个命令是RedHat专有的。其它Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。

 

最后生成的内核镜象有两种 zImage 以及 uImage 。其中 zImage 下载到目标板中后,可以直接用 uboot 的命令 go 来进行直接跳转。这时候内核直接解压启动。但是无法挂载文件系统,因为 go 命令没有将内核需要的相关的启动参数传递给内核。传递启动参数我们必须使用命令 bootm 来进行跳转。 Bootm 命令跳转只处理 uImage 的镜象。

uboot 源代码的 tools/ 目录下有 mkimage 工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。

mkimage 在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个 0x40 字节的头,记录参数所指定的信息,这样 uboot 才能识别这个映象是针对哪个 CPU 体系结构的,哪个 OS 的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么

用法如下:

./mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

-A ==> set architecture to 'arch'

-O ==> set operating system to 'os'

-T ==> set image type to 'type'

-C ==> set compression type 'comp'

-a ==> set load address to 'addr' (hex)

-e ==> set entry point to 'ep' (hex)

-n ==> set image name to 'name'

-d ==> use image data from 'datafile'

-x ==> set XIP (execute in place)

参数说明:

 

-A 指定CPU 的 体系结构:

 

取值 表示的体系结构

alpha Alpha

arm A RM

x86 Intel x86

ia64 IA64

mips MIPS

mips64 MIPS 64 Bit

ppc PowerPC

s390 IBM S390

sh SuperH

sparc SPARC

sparc64 SPARC 64 Bit

m68k MC68000

 

-O 指定操作系统类型,可以取以下值:

openbsdnetbsdfreebsd4_4bsdlinuxsvr4esixsolarisirixscodellncrlynxosvxworkspsosqnxu-bootrtemsartos

 

-T 指定映象类型,可以取以下值:

standalonekernelramdiskmultifirmwarescriptfilesystem

 

-C 指定映象压缩方式,可以取以下值:

none 不压缩

gzip gzip 的 压缩方式

bzip2 bzip2 的 压缩方式

 

-a 指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage 制作映象时,这个参数所指定的地址值来下载

 

-e 指定映象运行的入口点地址,这个地址就是-a 参数指定的值加上0x40 (因 为前面有个mkimage 添加的0x40 个字节的头)

 

-n 指定映象名

 

-d 指定制作映象的源文件

我在编译时用到的命令如下:

# make zImage      // 生成 zImage 镜象

/usr/local/arm/k9uboot/tools/ mkimage -n 'Linux 2.4.27' -A arm -O linux -T

kernel -C none -a 0x20007fc0 -e 0x20008000 -d zImage uImage

 

内核镜象已经准备好了,这个时候我们就要来准备文件系统了。由于时间缘故,本人暂时采用的是其他人已 经好的文件系统 k9.img.gz 。这个时候我们要做的 是,自己写一个简单 hello.c 的程序,编译通过后加入到 该文件系统中,然后下载到目标板中运行。

先编写 hello.c

编译:

#/usr/local/arm/2.95.3/bin/arm-linux-gcc  –o start-hello hello.c

编译后生成可执行文件 start-hello

下面我们就必须把该执行文件加入到文件系统中去,步骤如下:

#gunzip  k9.img.gz                     // 解压缩

#mount –o loop k9.img  /mnt/new_disk    // 挂载

#cp start-hello  /mnt/new_disk           // 将文件拷贝到文件系统中

#cd  /mnt/new_disk

#umount /mnt/new_disk                 // 卸载

#gzip –c –v9 k9.img > k9.img.gz          // 压缩 生成最终的文件系统

 

下面我们就要下载内核以及准备好文件系统了,这边先说明我的内存分配情况如下:

Flash

0x10000000 ――― 0x10020000     boot

0x10020000 ――― 0x10040000     uboot

0x10040000 ――― 0x10060000     uboot env

0x10060000 ――― 0x10200000     kernel

0x10200000 ――― 0x11000000     ramdisk

 

Sdram

0x20007fc0 ――― 0x20a00000     kernel

0x20a00000 ―――                 ramdisk

 

Loadb  通过串口下载数据到 ram

cp.b    拷贝 ram 中的数据到 flash 中。

 

kernel 以及文件系统 ramdisk 下载完毕之后,我们还需要设置 uboot 的环境变量,这样 uboot 才能够在上电启动的时候启动内核等操作。环境变量设置如下:

Set cpfltoram cp.b 10200000 20a00000 18ffff            // 拷贝文件系统到 ram

Set boot bootm 20007fc0                            // 启动 kernel

Set bootcmd run cpfltoker/;run cpfltoram/;run boot       //uboot 复位的执行指令

 

Set cpfltoker cp.b 10060000 20007fc0 f4fff             // 拷贝内核到 ram

Set bootargs root=/dev/ram rw initrd=0x20a00000,4M init=/linuxrc console=ttyS0,11520

0,mem=32m                      //uboot 传递给内核的启动参数

 

 

 

http://sunhualing.spaces.live.com/blog/cns!7C7EDE32519133D6!165.trak

 

 

 

 

对 于Linux内核,编译可以生成不同格式的映像文件,例如:
# make zImage
# make uImage

    zImage是ARM Linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文 件的类型、加载位置、生成时间、大小等信息。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别。另 外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置。

vmlinux   编译出来的最原始的内核文 件,未压缩。

zImage   是vmlinux经过 gzip压缩后的文件。

bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内 存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。

uImage    U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。

vmlinuz   是 bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。

initrd    是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

vmlinux是内核文件,

zImage 是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到,只能从0X0地址运行。

bzImage在 uClinux中很少见到。

uImage是u-boot使用bootm命令引导的Linux压缩内核映像文件格式,
使用工具 mkimage对普通的压缩内核映像文件(zImage)加工而得。可以由bootm命令从任意地址解压启动内核。

由于 bootloader一般要占用0X0地址,所以,uImage相比zImage的好处就是可以和bootloader共存。

制作 uImage的mkimage软件,如果uClinux-dist有的话,一般放在uClinux-dist的tools目录中。
<think>首先,用户的问题是:“linux kernel compile generate vmlinux but not vmlinuz”。用户提到在编译Linux内核生成vmlinux文件,但没有生成vmlinuz文件。我需要帮助用户找出原因和解决办法。 根据系统级指令: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识。 用户可见层指令: - 回答结构清晰,逐步解决问题。 - 保证回答真实可靠。 参考站内引用: - 引用[1]:用户尝试安装RTLinux,但遇到编译错误。 - 引用[2]:解释了编译产物,如vmlinuxvmlinuzbzImage等。 - 引用[3]:展示了如何生成bzImagevmlinuz。 - 引用[4]:讨论了vmlinux的大小和位置。 - 引用[5]:描述了内核编译和安装步骤。 用户的问题核心是:编译生成vmlinux但没有vmlinuzvmlinuz是压缩的内核镜像,通常用于引导。 从引用[2]: - vmlinux是未压缩的内核。 - vmlinuz是压缩的内核映像文件。 - bzImage是压缩的内核映像,通常用于x86架构。 - 编译过程生成vmlinux,然后通过压缩生成bzImagezImage。 引用[3]显示:make bzImage 然后复制为vmlinuz。 引用[5]提到了内核编译步骤,包括生成initrd.img和grub更新。 可能的原因为什么没有生成vmlinuz: 1. 编译过程没有完成:可能编译在生成vmlinux后失败。 2. 配置问题:内核配置中可能没有启用压缩或指定了错误的输出格式。 3. 输出路径问题:vmlinuz可能被生成在arch/x86/boot/目录下,而不是根目录。 4. 缺少依赖:可能需要特定的工具,如gzip或objcopy。 5. 编译命令错误:用户可能没有运行make bzImage或make zImage。 解决方案: - 检查编译日志:查看是否有错误信息。 - 确保运行了正确的make目标:如make bzImage。 - 确认输出目录:vmlinuz通常位于arch/x86/boot/bzImage(对于x86),然后可能需要复制到/boot。 - 验证内核配置:确保配置正确。 回答结构: 1. **问题分析**:解释为什么可能没有生成vmlinuz。 2. **常见原因**:列出可能的原因。 3. **解决步骤**:提供逐步的解决办法。 4. **验证**:如何确认成功生成。 5. **生成相关问题**:在最后添加相关问题。 使用中文回答。 生成相关问题: - 例如:如何配置内核编译选项? - 如何解决内核编译错误? - 如何安装内核模块? 引用标识:在回答中引用站内内容时添加[^数字]。 现在,构建回答。</think>### Linux内核编译生成vmlinux但未生成vmlinuz的原因和解决方法 在编译Linux内核时,生成了`vmlinux`文件(未压缩的内核可执行文件)但未生成`vmlinuz`(压缩的内核引导镜像),这是一个常见问题。`vmlinux`是编译过程的中间产物,而`vmlinuz`(或其等效文件如`bzImage`)是最终用于系统引导的压缩镜像。下面我将逐步分析原因并提供解决方法,确保回答真实可靠,基于Linux内核编译的标准流程和参考信息。 #### 问题分析 - **为什么只生成vmlinux?** `vmlinux`是编译链接后生成的未压缩ELF格式内核文件,包含所有符号和调试信息。而`vmlinuz`是通过压缩`vmlinux`(或直接生成压缩镜像如`bzImage`)得到的引导文件。未生成`vmlinuz`通常表示编译过程未完成压缩步骤,或配置/工具问题导致压缩失败[^2]。 - **关键区别**: - `vmlinux`:未压缩、不可引导,用于调试(大小可达数百MB)。 - `vmlinuz`:压缩后的可引导镜像(通常基于`bzImage`或`zImage`),大小较小(如512KB以内),位于`arch/<arch>/boot/`目录下[^2][^4]。 - **常见症状**:编译日志显示成功生成`vmlinux`,但缺少`arch/x86/boot/bzImage`(或类似路径),或未自动复制为`/boot/vmlinuz-<version>`。 #### 可能原因 根据编译流程和参考信息,以下是常见原因: 1. **编译过程未完成**:运行`make`后未执行压缩步骤(如`make bzImage`),导致只生成`vmlinux`而跳过`vmlinuz`[^2][^3]。 2. **内核配置错误**:配置文件中未启用压缩选项(如未设置`CONFIG_KERNEL_BZIP2`或`CONFIG_KERNEL_GZIP`),或架构相关选项错误。 3. **输出路径问题**:`vmlinuz`等效文件(如`bzImage`)被生成在`arch/x86/boot/`目录,但未被复制到`/boot`目录,误以为缺失[^3][^4]。 4. **依赖工具缺失**:缺少压缩工具(如`gzip`、`objcopy`)或库文件,导致压缩步骤失败[^2][^5]。 5. **编译中断或错误**:编译日志中可能存在未处理的错误(如符号冲突或内存不足),但被忽略,只部分完成。 #### 解决步骤 按照以下步骤检查和修复问题,确保操作在Linux源码目录(如`/usr/src/linux-<version>`)进行。 1. **检查编译日志** 首先,查看编译输出日志,确认是否有错误: ```bash # 重新运行编译,捕获日志 make clean # 清理旧文件 make -j$(nproc) 2>&1 | tee compile.log grep -i "error" compile.log # 搜索错误 ``` 常见错误:缺少库(如`libssl-dev`)或工具(如`bc`),需通过包管理器安装(例如Ubuntu:`sudo apt install build-essential libncurses-dev bison flex libssl-dev`)[^2][^5]。 2. **运行正确的make目标** 确保执行压缩步骤生成`bzImage`(x86架构标准): ```bash make bzImage # 生成压缩镜像,输出为 arch/x86/boot/bzImage ``` 完成后,检查输出文件: ```bash file arch/x86/boot/bzImage # 应显示 "Linux kernel x86 boot executable bzImage" ls -l arch/x86/boot/bzImage # 确认文件大小(通常几百KB) ``` 如果成功,`bzImage`等效于`vmlinuz`,可手动复制到`/boot`[^3][^4]: ```bash sudo cp arch/x86/boot/bzImage /boot/vmlinuz-$(uname -r)-custom ``` 3. **验证内核配置** 检查配置文件(`.config`)是否支持压缩: ```bash make menuconfig # 或使用 make oldconfig ``` 确保以下选项启用: - `Processor type and features` → `Kernel compression mode` 设置为 `Gzip` 或 `Bzip2`。 - 确认架构正确(如x86选`CONFIG_X86_64=y`)。 保存后重新编译: ```bash make bzImage ``` 4. **解决依赖问题** 如果编译失败,安装常见依赖: ```bash # Ubuntu/Debian sudo apt update sudo apt install gcc make flex bison libelf-dev libssl-dev # CentOS/RHEL sudo yum groupinstall "Development Tools" sudo yum install elfutils-libelf-devel openssl-devel ``` 5. **完整编译和安装流程** 参考标准步骤确保所有环节完成[^5]: ```bash make clean make menuconfig # 配置 make -j$(nproc) # 编译所有,包括模块 sudo make modules_install # 安装模块 sudo make install # 自动生成vmlinuz并更新GRUB ``` `make install`会自动将`bzImage`复制为`/boot/vmlinuz-<version>`并生成`initrd.img`[^5]。 #### 验证成功 - 检查文件: ```bash ls /boot/vmlinuz-* # 应包含新版本 file /boot/vmlinuz-<version> # 输出应为 "bzImage" 或 "gzip compressed" ``` - 更新GRUB并重启: ```bash sudo update-grub # 或 grub2-mkconfig -o /boot/grub/grub.cfg sudo reboot ``` #### 注意事项 - **性能考虑**:编译大型内核时,内存不足可能导致失败,建议在4GB+ RAM环境中操作。 - **调试帮助**:如果问题持续,分享`compile.log`内容以便进一步分析。 通过以上步骤,大多数情况下能成功生成`vmlinuz`。如果编译日志显示特定错误,请提供详细信息以便针对性解决[^1][^2]。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值