Linux 关于vmlinux和vmlinuz

1.vmlinux

  vmlinux是一个包括linux kernel的静态链接的可运行文件。文件类型是linux接受的可运行文件格式之中的一个(ELF、COFF或a.out)。

2.vmlinuz

  vmlinuz是可引导的,压缩的linux内核,“vm”代表的“virtual memory”。

vmlinuz是vmlinux经过gzip和objcopy(*)制作出来的压缩文件。vmlinuz不仅是一个压缩文件,并且在文件的开头部分内嵌有gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。

vmlinuz是一个统称。有两种详细的表现形式:zImage和bzImage(big zImage)。

 zImage和bzImage的差别在于本身的大小和载入到内存的地址不同。zImage是0~640KB,bzImage是1M以上。假设内核比較小。那么能够採用zImage 或bzImage之中的一个,两种方式引导的系统运行时是同样的。大的内核採用bzImage。不能採用zImage。

3. 综述

总结起来就是例如以下的几句话:

vmlinux 是ELF文件。即编译出来的最原始的文件。

vmlinuz应该是由ELF文件vmlinux经过OBJCOPY后。并经过压缩后的文件 
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核

*objcopy:将一种目标文件的内容拷贝到还有一种目标文件里。

 

一、Linux内核镜像格式  
   Linux内核有多种格式的镜像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.
(1)kernel镜像格式:vmlinux
   vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩.这种格式的镜像文件多存放在PC机上.
  【 attention】elf格式文件
      ELF,Executable and Linkable Format,可执行可链接格式,是UNIX实验室作为应用程序二进制接口而发布的,扩展名为elf.可以简单的认为,在elf格式的文件中,除二进制代 码外,还包括该可执行文件的某些信息,比如符号表等.
(2)kernel镜像格式:Image
   Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩.
  【 attention】objcopy
      GNU使用工具程序objcopy作用是拷贝一个目标文件的内容到另一个目标文件中,也就是说,可以将一种格式的目标文件转换成另一种格式的目标文件. 通过使用binary作为输出目标(-o binary),可产生一个原始的二进制文件,实质上是将所有的符号和重定位信息都将被抛弃,只剩下二进制数据.
(3)kernel镜像格式:zImage
   zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成,命令格式是#make zImage.这种格式的Linux镜像文件多存放在NAND上.
(4)kernel镜像格式:bzImage
   bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,注意,bzImage的压缩率更高.
(5)kernel镜像格式:uImage
   uImage是uboot专用的镜像文件,它是在zImage之前加上一个长度为0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载 位置、生成时间、大小等信息.换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别.命令格式是#make uImage.这种格式的Linux镜像文件多存放在NAND上.
(6)kernel镜像格式:xipImage
   这种格式的Linux镜像文件多存放在NorFlash上,且运行时不需要拷贝到内存SDRAM中,可以直接在NorFlash中运行.


二、Linux内核镜像的产生过程
  在嵌入式Linux中,内核的启动过程分为两个阶段.其中,第一阶段启动代码放在arch/arm/kernel/head.S文件中,该文件与体系 结果相关,与用户的开发板无关,主要是初始化ARM内核等.第二阶段启动代码是init目录下的main.c.现以执行命令#make zImage为例来说明,arm-linux内核镜像的产生过程.
(1)当用户对Linux内核源码进行编译时,kernel的第1/2阶段代码会生成可执行文件vmlinux,该文件是未被压缩的镜像文件,非常大,不能直接下载到NAND中,通常放在PC机上,这也是最原始的Linux镜像文件.试验时该文件约50M.
(2)镜像文件vmlinux由于很大,肯定不能直接烧入NAND中,因此需要进行二进制化,即经过objcopy处理,使之只包含二进制数据的内核代 码,去除不需要的文件信息等,这样就制作成了image镜像文件.该镜像文件也是未压缩,只是经过了二进制化而变小.试验时该文件约5M.
(3) 一般来说,内存SDRAM中的内核镜像是经过压缩的,只是在运行时再将其解压.所以,编译时会先使用gzip将镜像文件image进行压缩(压缩比约为 2:1),再将压缩后的镜像文件和源码中的两个文件arch/arm/boot/compressed/head.S、arch/arm/boot /compressed/misc.c一起链接生成压缩后的镜像文件compress/vmlinux.试验时该文件约为2.5M.注意,这两个源码文件 是解压程序,用于将内存SDRAM中的压缩镜像zImage进行解压.
(4)压缩后的镜像文件compress/vmlinux经过二进制化,最终生成镜像文件zImage,试验时该文件约为2.5M.当然,在内存 SDRAM中运行压缩镜像文件zImage时,会首先调用两个解压程序arch/arm /boot/compressed/head.S、arch/arm/boot/compressed/misc.c将自身解压,然后再执行kernel 的第一阶段启动代码arch/arm/kernel/head.S.简而言之,在内存中运行内核时,kernel先自身解压,再执行第一阶段启动代码.试 验时运行在内存中的镜像文件约为5M,与image镜像文件大小相同.
【 attention】
(1) 网站:http://lxr.linux.no/
   该网站通过了Linux内核源码,不用解压,在线查询,非常方便.
(2)生成的镜像文件vmlinux放在源码的顶层目录下.
(3)生成的镜像文件image、zImage均在arch/arm/boot目录下.
(4)启动开发板时,在超级终端内会有许多的提示信息,其中:
      booting linux ...  /*表示正在将内核从NAND拷贝到内存中*/
      unpressed...      /*表示正在解压内核*/
(5)只有当用户输入boot命令或在boot_delay延时时间后,vivi才将NANDFlash中的内核kernel拷贝到内存SDRAM中.也就是说,当vivi进入命令行模式时,在SDRAM中并没有内核kernel.
(6)在kernel源码目录下执行命令:
  <1> #tree       /*打印出kernel源码的目录结构*/
  <2> #tree -L 1   /*打印出kernel源码的第一级目录结构*/
  <3> #tree > /home/lishuai/linux.txt   /*将kernel源码的目录结构重定向到某个文件中,用户可以随时查看其目录结构,非常方便*/

 

<think>嗯,用户问到了“vmlinux命令”,但根据我的知识库,vmlinux其实并不是一个命令,而是Linux内核编译后生成的可执行文件。用户可能混淆了命令文件,或者是在某些教程里看到相关操作,但不太清楚具体用途。 首先,我需要确认用户的需求。他们可能遇到了内核相关的问题,或者在编译内核时看到了vmlinux文件,想知道如何操作它。也有可能是在调试或分析内核时遇到这个文件,需要了解其作用。 接下来,我要回想vmlinux的相关信息。vmlinux是未经压缩的内核镜像,通常用于调试,因为包含符号信息。而常见的/boot/vmlinuz是压缩过的,去除了调试符号以节省空间。用户可能想了解如何生成、使用或分析这个文件。 然后,用户可能误以为存在一个叫vmlinux的命令,需要纠正这个误解,并解释相关工具,比如objdump、gdb、readelf等,这些工具可以用来分析vmlinux文件。同时,用户可能想知道如何从vmlinzuz提取vmlinux,或者如何编译生成它。 还要考虑用户的使用场景。他们可能是开发者或系统管理员,正在处理内核崩溃、调试问题,或者学习内核编译过程。需要提供实际的命令示例,比如使用objdump反汇编,用gdb调试,或者提取符号信息。 另外,用户可能遇到的问题包括如何生成vmlinux(编译内核时的选项),或者处理文件不存在的情况,需要检查内核编译步骤是否正确,是否启用了调试符号。这时需要给出建议,比如检查.config文件中的CONFIG_DEBUG_INFO选项。 最后,要确保回答结构清晰,分点说明vmlinux是什么,相关工具,操作示例,常见问题,以及vmlinuz的区别,帮助用户全面理解,并解决他们潜在的实际问题。</think>好的!关于 `vmlinux` 的用途相关操作,以下是详细说明: --- ### 一、`vmlinux` 是什么? **`vmlinux` 是 Linux 内核编译后生成的未压缩的、包含调试符号的原始可执行文件**,它不是一条命令,而是内核的静态链接文件。 - **关键特性**: - 文件格式:`ELF`(可执行与可链接格式) - 包含完整的符号表调试信息(用于内核调试) - 体积较大(通常几百MB到几GB) - 一般路径:编译内核时生成在源码根目录下(例如:`linux-5.10/vmlinux`) --- ### 二、`vmlinux` 与 `vmlinuz` 的区别 | 特性 | `vmlinux` | `vmlinuz` (或 `/boot/vmlinuz-*`) | |---------------|-----------------------------|-----------------------------------| | **压缩** | 未压缩 | 使用 `gzip`/`xz` 等压缩 | | **调试符号** | 保留完整符号表 | 移除符号表(体积更小) | | **用途** | 内核开发调试 | 系统实际启动的内核文件 | | **生成方式** | 编译内核时自动生成 | 对 `vmlinux` 压缩后生成 | --- ### 三、与 `vmlinux` 相关的操作 虽然 `vmlinux` 本身不是命令,但可以通过工具对其分析或操作: #### 1. **反汇编内核代码** ```bash $ objdump -d vmlinux > disassembly.txt # 输出反汇编代码 $ objdump -S vmlinux > disassembly_with_source.txt # 混合源代码的反汇编(需编译时启用调试信息) ``` #### 2. **使用 GDB 调试内核** ```bash $ gdb vmlinux # 启动调试 (gdb) target remote localhost:1234 # 连接 QEMU 虚拟机(需内核启动时启用 KGDB) (gdb) break start_kernel # 设置断点 ``` #### 3. **提取内核符号表** ```bash $ nm vmlinux > symbols.txt # 列出所有符号(函数、变量地址) $ grep "sys_open" symbols.txt # 查找特定符号地址 ``` #### 4. **生成 `System.map` 文件** ```bash $ nm vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System.map ``` #### 5. **从 `vmlinuz` 提取 `vmlinux`** ```bash $ scripts/extract-vmlinux /boot/vmlinuz-$(uname -r) > vmlinux # 需要内核源码中的脚本 ``` --- ### 四、如何生成 `vmlinux`? 在编译内核时,默认会生成 `vmlinux`。操作步骤: 1. 配置内核: ```bash $ make menuconfig # 确保启用 CONFIG_DEBUG_INFO(生成调试符号) ``` 2. 编译内核: ```bash $ make -j$(nproc) # 编译完成后,源码目录下会生成 vmlinux ``` --- ### 五、常见问题 #### 1. **为什么我的系统里没有 `vmlinux`?** - **原因**:发行版默认不提供未压缩的调试内核文件。 - **解决方案**: - 自行编译内核(需启用 `CONFIG_DEBUG_INFO`)。 - 从发行版仓库下载调试包(例如:Debian 的 `linux-image-*-dbg`)。 #### 2. **`vmlinux` 文件太大,如何处理?** - 使用 `strip` 移除符号表(但会失去调试能力): ```bash $ strip --strip-debug vmlinux # 生成 stripped_vmlinux(体积减小) ``` #### 3. **如何分析内核崩溃(Kernel Panic)?** - 结合 `vmlinux` `crash` 工具: ```bash $ crash /path/to/vmlinux /path/to/vmcore # 分析内核转储文件 ``` --- ### 六、工具依赖 以下工具可能需要提前安装: ```bash # Debian/Ubuntu $ sudo apt install binutils gdb crash linux-source # RHEL/CentOS $ sudo yum install binutils gdb crash kernel-debuginfo ``` --- ### 总结 - **`vmlinux` 是内核调试的核心文件**,用于分析崩溃、追踪性能问题或学习内核实现。 - 普通用户无需直接操作它,但开发者或系统维护者需要熟悉其用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值