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

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

小编点评

**Linux内核映像类型比较** | 类型 | 描述 | |---|---| | vmlinux | 原始内核文件,elf格式,未压缩处理 | | Image | 二进制内核映像,未压缩,可引导Linux系统启动 | | zImage | 使用gzip压缩后的内核映像 | | uImageuImage | 在zImage前面增加一个64字节的头,描述映像文件类型、加载位置和大小等信息 |

正文

https://zhuanlan.zhihu.com/p/466226177

 

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

 

 

一、vmlinux

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

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

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

root@ubuntu:/home/run/code/rockchip-bsp/kernel# readelf -h vmlinux
ELF 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

二、Image

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

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

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

root@ubuntu:/home/run/code/rockchip-bsp# ./build/mk-kernel.sh rockpi4a
 Building kernel for rockpi4a board!
4.4.154                                     ## 4.4.154内核
  ...
  LINK    vmlinux
  LD      vmlinux.o
  MODPOST vmlinux.o
  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  LD      init/built-in.o
  KSYM    .tmp_kallsyms1.o
  KSYM    .tmp_kallsyms2.o
  LD      vmlinux                            
  SORTEX  vmlinux
  SYSMAP  System.map
  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过程如下:

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

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

 

 

Linux映像生成过程

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

与[转帖]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