[转帖]Linux内核映像vmlinux、Image、zImage、uImage区别
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内核为大规模支持100Gb/s网卡准备好了吗?并没有
Linux内核为大规模支持100Gb/s网卡准备好了吗?并没有 之前用 千兆的机器 下载速度 一般只能到 50MB 左右 没法更高 万兆的话 可能也就是 200MB左右的速度 很难更高 不知道后续的服 ...
- [转帖]Linux内核系统体系概述
Linux内核系统体系概述 https://www.cnblogs.com/alantu2018/p/8447369.html Linux 内核主要由 5 个模块构成,它们分别是: 进程调度模块 用来 ...
- [转帖]Linux内核剖析(一)Linux的历史
Linux内核剖析(一)Linux的历史 https://www.cnblogs.com/alantu2018/p/8991158.html Unix操作系统 Unix的由来 汤普逊和里奇最早是在贝尔 ...
- linux内核中的每cpu变量
一.linux中的每cpu变量 看linux内核代码的时候,会发现大量的per_cpu(name, cpu),get_cpu_var(name)等出现cpu字眼的语句.从语句的意思可以看出是要使用与当 ...
- 20169212《Linux内核原理与分析》第五周作业
关于linux内核源码 两个很关键的目录,一个是arch(architecture),支持不同cpu体系架构的源代码,其中最重要的就是x86(一般把x86留下,其他的目录删掉),另一个是init(其中 ...
- linux内核编译相关
参考:http://www.arm.linux.org.uk/docs/kerncomp.php 一. 内核编译1) linux 2.4make clean/make mrpropermake dep ...
- linux 内核 zImage 生成过程分析
1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩,带调试信息.符号表的最初的内核,大小约23MB: arm ...
- Linux内核剖析(五)Linux内核的构建过程
参考 一次实验引发的故事 – kernel build system探索—vmlinux是如何炼成的– kernel makefile 深度探索Linux操作系统:系统构建和原理解析.pdf 问题 在 ...
- Linux内核启动流程分析(一)【转】
转自:http://blog.chinaunix.net/uid-25909619-id-3380535.html 很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下.由于是word直接 ...
- 20169211《Linux内核原理与分析》第三周作业
假期中抽时间学习了一下linux内核的启动过程,在此做一下学习总结. Linux启动过程描述: 1.启动BootLoader 2.Linux系统的初始化 3.Linux的应用程序的初始化 通用寄存器的 ...
随机推荐
- 2023-11-01:用go语言,沿街有一排连续的房屋。每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小
2023-11-01:用go语言,沿街有一排连续的房屋.每间房屋内都藏有一定的现金, 现在有一位小偷计划从这些房屋中窃取现金, 由于相邻的房屋装有相互连通的防盗系统,所以小偷 不会窃取相邻的房屋, 小 ...
- GetView介绍 以及 GetxController生命周期
etView 只是对已注册的 Controller 有一个名为 controller 的getter的 const Stateless 的 Widget,如果我们只有单个控制器作为依赖项,那我们就可以 ...
- 第三部分_Shell脚本简单四则运算
简单四则运算 算术运算:默认情况下,shell就只能支持简单的整数运算 运算内容:加(+).减(-).乘(*).除(/).求余数(%) 1. 四则运算符号 表达式 举例 $(( )) | echo $ ...
- 十八般武艺玩转GaussDB(DWS)性能调优:总体调优策略
摘要: 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目实施过程中占据很大的份量,本篇主要介绍数据库级别的性能调优思路和总体策略. 性能调优是应用迁移或开发过程中的关键步骤,同时也在整个项目 ...
- 这是你没见过的MindSpore 2.0.0 for Windows GPU版
摘要:一文带你看看MindSpore 2.0.0 for Windows GPU版. 本文分享自华为云社区<MindSpore 2.0.0 for Windows GPU泄漏版尝鲜>,作者 ...
- 总结vue3 的一些知识点:MySQL NULL 值处理
MySQL NULL 值处理 我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作. ...
- 大数据 - ODS&DWD&DIM-SQL分享
大数据 ODS&DWD&DIM-SQL分享 需求 思路一:等差数列 断2天.3天,嵌套太多 1.1 开窗,按照 id 分组,同时按照 dt 排序,求 Rank -- linux 中空格 ...
- MappedByteBuffer 写文件
MappedByteBuffer中"put"和"force"的区别是什么 put()将数据存储在缓冲区中,force()通知操作系统将缓冲区刷新到磁盘. put ...
- Python中节省内存的方法之一:__slots__属性
Python是一门动态语言,可以在运行过程中,修改实例的属性和增删方法.任何实例都包含一个字典__dict__,该字典保存了实例所有的属性和方法.Python也通过这个字典可以将任意属性绑定到实例上. ...
- 生成学习全景:从基础理论到GANs技术实战
本文全面探讨了生成学习的理论与实践,包括对生成学习与判别学习的比较.详细解析GANs.VAEs及自回归模型的工作原理与结构,并通过实战案例展示了GAN模型在PyTorch中的实现. 关注TechLea ...