[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别

linux,内核,映像,vmlinux,image,zimage,uimage,区别 · 浏览次数 : 0

小编点评

## Linux内核映像的几种类型 **1. vmlinux** * 是Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。 * 可用于定位内核问题,但不能直接引导Linux系统启动。 * 使用readelf命令查看RockPI 4A单板Linux内核编译的vmlinux,内容如下: ``` root@ubuntu:/home/run/code/rockchip-bsp/kernel# readelf -h vmlinuxELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: AArch64 ## 64位系统 Version: 0x1 Entry point address: 0xffffff8008080000 Start of program headers: 64 (bytes into file) Start of section headers: 264512168 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 4 Size of section headers: 64 (bytes) Number of section headers: 36 Section header string table index: 35 ``` **2. Image** * 是Linux内核编译时,使用objcopy处理vmlinux后生成的二进制内核映像。 * 该映像未压缩,可直接引导Linux系统启动。 **3. zImage** * 使用gzip压缩Image后,使用objcopy命令生成的Linux内核映像。 * 该映像一般作为uboot的引导映像文件。 **4. uImage** * 在zImage前面增加一个64字节的头,描述映像文件类型,加载位置,大小等信息。 * 该映像是老版本uboot专用的引导映像。 **总结:** * vmlinux 是内核编译出来的原始内核文件,无法直接引导Linux系统启动。 * Image 是内核编译时,使用objcopy处理的二进制内核映像,可直接引导Linux系统启动。 * zImage 是使用gzip压缩后的内核映像,通常作为uboot的引导映像文件。 * uImage 是在zImage前面增加64字节的头,描述映像文件类型,加载位置,大小等信息,通常用于老版本uboot引导映像。

正文

本文介绍几种常用的Linux内核映像的区别。

一、vmlinux

vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。

该映像可用于定位内核问题,但不能直接引导Linux系统启动。

使用readelf命令查看RockPI 4A单板Linux内核编译的vmlinux,内容如下:

  1. root@ubuntu:/home/run/code/rockchip-bsp/kernel# readelf -h vmlinux
  2. ELF Header:
  3. Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
  4. Class: ELF64
  5. Data: 2's complement, little endian
  6. Version: 1 (current)
  7. OS/ABI: UNIX - System V
  8. ABI Version: 0
  9. Type: EXEC (Executable file)
  10. Machine: AArch64 ## 64位系统
  11. Version: 0x1
  12. Entry point address: 0xffffff8008080000
  13. Start of program headers: 64 (bytes into file)
  14. Start of section headers: 264512168 (bytes into file)
  15. Flags: 0x0
  16. Size of this header: 64 (bytes)
  17. Size of program headers: 56 (bytes)
  18. Number of program headers: 4
  19. Size of section headers: 64 (bytes)
  20. Number of section headers: 36
  21. Section header string table index: 35

二、Image

Image:Linux内核编译时,使用objcopy处理vmlinux后生成的二进制内核映像。

该映像未压缩,可直接引导Linux系统启动。

RockPI 4A单板Linux内核编译vmlinux和Image过程如下:

  1. root@ubuntu:/home/run/code/rockchip-bsp# ./build/mk-kernel.sh rockpi4a
  2. Building kernel for rockpi4a board!
  3. 4.4.154 ## 4.4.154内核
  4. ...
  5. LINK vmlinux
  6. LD vmlinux.o
  7. MODPOST vmlinux.o
  8. GEN .version
  9. CHK include/generated/compile.h
  10. UPD include/generated/compile.h
  11. CC init/version.o
  12. LD init/built-in.o
  13. KSYM .tmp_kallsyms1.o
  14. KSYM .tmp_kallsyms2.o
  15. LD vmlinux
  16. SORTEX vmlinux
  17. SYSMAP System.map
  18. OBJCOPY arch/arm64/boot/Image ## 使用objcopy命令将vmlinux变为Image映像

objcopy命令的用法后续介绍。

三、zImage

zImage:使用gzip压缩Image后,使用objcopy命令生成的Linux内核映像。

该映像一般作为uboot的引导映像文件。uboot引导命令后续介绍。

四、uImage

uImage:在zImage前面增加一个64字节的头,描述映像文件类型,加载位置,大小等信息。

该映像是老版本uboot专用的引导映像。

下图是基于imx6 处理器Linux内核编译出的zImage和uImage的差异,区别如下:

zImage和uImage的差异

imx6单板Linux内核编译zImage和uImage过程如下:

  1. root@ubuntu:/home/run/code/imx6/linux-3.0.35# ./mk_kernel.sh
  2. arch/arm/configs/imx6_defconfig:1629:warning: override: reassigning to symbol SND_SOC_IMX_WM8962
  3. ...
  4. LD vmlinux ## 1.制作vmlinux
  5. SYSMAP System.map
  6. SYSMAP .tmp_System.map
  7. OBJCOPY arch/arm/boot/Image ## 2.使用objcopy命令生成Image
  8. Kernel: arch/arm/boot/Image is ready
  9. GZIP arch/arm/boot/compressed/piggy.gzip ## 3.压缩
  10. AS arch/arm/boot/compressed/piggy.gzip.o
  11. SHIPPED arch/arm/boot/compressed/lib1funcs.S
  12. AS arch/arm/boot/compressed/lib1funcs.o
  13. LD arch/arm/boot/compressed/vmlinux
  14. OBJCOPY arch/arm/boot/zImage ## 4.使用objcopy命令生成zImage
  15. Kernel: arch/arm/boot/zImage is ready
  16. UIMAGE arch/arm/boot/uImage ## 5.使用mkimage命令生成uImage
  17. Image Name: Linux-3.0.35-2666-gbdde708-g5083
  18. Created: Sun May 2 08:38:41 2021
  19. Image Type: ARM Linux Kernel Image (uncompressed)
  20. Data Size: 3250684 Bytes = 3174.50 kB = 3.10 MB
  21. Load Address: 0x10008000
  22. Entry Point: 0x10008000
  23. Image arch/arm/boot/uImage is ready

下图展示了不同类型的Linux映像生成过程。

Linux映像生成过程

注:zImage和uImage用于32位内核。

文章知识点与官方知识档案匹配,可进一步学习相关知识
CS入门技能树Linux入门初识Linux25440 人正在系统学习中
一口Linux
微信公众号
嵌入式Linux硬核号主!

与[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别相似的内容:

[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别

本文介绍几种常用的Linux内核映像的区别。 一、vmlinux vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。 该映像可用于定位内核问题,但不能直接引导Linux系统启动。 使用readelf命令查看RockPI 4A单板Linux内核编译的vmlinux,内容

[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别

https://zhuanlan.zhihu.com/p/466226177 本文介绍几种常用的Linux内核映像的区别。 一、vmlinux vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。 该映像可用于定位内核问题,但不能直接引导Linux系统启动。 使用rea

[转帖]《Linux性能优化实战》笔记(八)—— 内存是怎么工作的

一、 内存映射 我们通常所说的内存容量,指的是物理内存。物理内存也称为主存,大多数计算机用的主存都是动态随机访问内存(DRAM)。只有内核才可以直接访问物理内存。那么,进程要访问内存时,该怎么办呢? Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以

[转帖]Linux 页表、大页与透明大页

一、 内存映射与页表 1. 内存映射 我们通常所说的内存容量,指的是物理内存,只有内核才可以直接访问物理内存,进程并不可以。 Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。 虚拟地址空间的内部又被分为内

[转帖]Linux 页表、大页与透明大页

一、 内存映射与页表 1. 内存映射 我们通常所说的内存容量,指的是物理内存,只有内核才可以直接访问物理内存,进程并不可以。 Linux 内核给每个进程都提供了一个独立的虚拟地址空间,并且这个地址空间是连续的。这样,进程就可以很方便地访问内存,更确切地说是访问虚拟内存。 虚拟地址空间的内部又被分为内

[转帖]Linux中的零拷贝技术

https://www.jianshu.com/p/a757a93b6e5f 内存映射--mmap 内核和用户空间,共享内存。数据copy到内核区后,只需要把地址共享给应用程序即可,无需再copy一次数据到用户空间。 image.png 优点: 用户程序可以读取和修改共享内存的数据,就像读取用户空间

[转帖]Linux性能优化和内核观测 - 内存篇(一)

内存虚拟内存Linux 采用的是​​虚拟内存​​机制,每个进程都有自己的虚拟内存地址空间,仅当实际使用内存的时候才会映射到物理内存地址之上。这种设计提供了物理内存的超额分配,Linux 中的内存管理机制包括页换出守护进程(page out daemon)、物理换页设备(swap device),以及

[转帖]linux性能优化-内存回收

linux文件页、脏页、匿名页 缓存和缓冲区,就属于可回收内存。它们在内存管理中,通常被叫做文件页(File-backed Page)。通过内存映射获取的文件映射页,也是一种常见的文件页。它也可以被释放掉,下次再访问的时候,从文件重新读取。 大部分文件页,都可以直接回收,以后有需要时,再从磁盘重新读

[转帖]Linux 写时复制技术

https://www.cnblogs.com/dwtfukgv/p/15125933.html 目录 Linux fork Linux exec Linux 进程虚拟地址空间 栈 内存映射段 堆 BSS段 数据段 代码段 分段的优点 页表 写时复制原理 非写时复制fork一个子进程 写时复制for

[转帖]Linux内核 TCP/IP、Socket参数调优

文章系转载,便于整理和分类,原文地址:http://www.360doc.com/content/14/0606/16/3300331_384326124.shtml Doc1: /proc/sys/net目录 所有的TCP/IP参数都位于/proc/sys/net目录下(请注意,对/proc/sy