vmlinux,vmlinuz,uImage,zImage,bzImage 之间的异同

2024-03-10 18:32

本文主要是介绍vmlinux,vmlinuz,uImage,zImage,bzImage 之间的异同,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

vmlinux,vmlinuz,uImage,zImage,bzImage之间的异 同  


在网络中,不少服务器采用的是Linux系统。为了进一步提高服务器的性能,可能需要根据特定的硬件及需求重新编译Linux内 核。编译Linux 内核,需要根据规定的步骤进行,编译内核过程中涉及到几个重要的文件。比如对于RedHat Linux,在/boot目录下有一些与Linux内核有关的文件,进入/boot执行。
  编译过RedHat Linux内核的人对其中的System.map、vmlinuz、initrd-2.4.7-10.img印象可能比较深刻,因为编译内核过程中涉及到 这些文件的建立等操作。那么这几个文件是怎么产生的?又有什么作用呢?本文对此做些介绍。
  一、vmlinuz
  vmlinuz是可 引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行 的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接,比如图中是vmlinuz-2.4.7-10的软链接。
   vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,手动拷贝到/boot目录下面。zImage适用于小内核的情况,它的存在是为了向后的兼容性。
  二是内核编译时通过命令 make bzImage创建,然后手动拷贝至/boot目录下。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩 的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。 zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip压缩的。它们不仅是一个压缩文件,而且在这两个文件的开头部分内嵌有 gzip解压缩代码。所以你不能用gunzip 或 gzip –dc解包vmlinuz。
  内核文件中包含一个微型的gzip用于解压缩内 核并引导它。两者的不同之处在于,老的zImage解压缩内核到低端内存(第一个 640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么可以采用zImage或bzImage之一,两种方式引导的系统运行 时是相同的。大的内核采用bzImage,不能采用zImage。vmlinux是未压缩的内核,vmlinuz是vmlinux的压缩文件。
   二、initrd-x.x.x.img
  initrd是“initial ramdisk”的简写。initrd一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。图中的initrd- 2.4.7-10.img主要是用于加载ext3等文件系统及scsi设备的驱动。
  比如,使用的是scsi硬盘,而内核vmlinuz中并没 有这个scsi硬件的驱动,那么在装入scsi模块之前,内核不能加载根文件系统,但 scsi模块存储在根文件系统的/lib/modules下。为了解决这个问题,可以引导一个能够读实际内核的initrd内核并用initrd修正 scsi引导问题。initrd-2.4.7-10.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。
   initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的(这也是为什 么,在Linux内核包里/Documentation/Changes里面没有提到要将mkinitrd升级)。其它Linux发行版或许有相应的命 令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。
   三、uImage文件
   vmlinux是内核文件,zImage是一般情况下默认的压缩内核映像文件,压缩vmlinux,加上一段解压启动代码得到。而uImage则是使用 工具mkimage对普通的压缩内核映像文件(zImage)加工而得。它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的 “头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。 
其实就是一个自动跟手动的区别,有了 uImage头部的描述,u-boot就知道对应Image的信息,如果没有头部则需要自己手动去搞那些参数。
如何生成uImage文件?首先在 uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制作工具。然后在内核目录下 运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比 zImage多64个字节。

此外,平时调试用uImage,不用去管调整了哪些东西;zImage则是一切OK后直接烧 0X0。开机就运行。

在make install发生的事

在make install后, 会有三个文件被放到/boot下:
1. vmlinuz-2.6.x.y.z
2. System.map
3. config
4. 为什么我的 gentoo没有initrd.img的??
在/usr/src/linux下还有一个vmlinux的方件.

 

那么/boot下的vmlinux是哪个呢? 如下:

jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /usr/src/linux/vmlinux
Files /usr/src/linux/arch/x86/boot/bzImage and /usr/src/linux/vmlinux differ
jessinio@niolaptop /usr/src/linux $ diff /usr/src/linux/arch/x86/boot/bzImage /boot/vmlinuz

可以看出/boot下的vmlinux是/usr/src/linux/arch/x86/boot/bzImage


随便提一下make内核时的过程:

就常使用的make也过程:
cd /usr/src/linux
make menuconfig
make
make modules_install
make install

注意到上面的一个make是不参数的, 这种情况实际如下:
Execute "make" or "make all" to build all targets marked with [*]

"*" 号等于如下:
make vlinux modules bzImage

 

zImage / vmlinux / Image生成的流程图

   SRC_TREE    :=./
HEADER_PATH    :=arch/arm/boot/compressed
BOOT_PATH    :=arch/arm/boot/
KERNEL_PATH    :=arch/arm/kernel

 


-----------------------------------------------------------------------------------------------------------------------

1 SRC_TREE 目录下的vmlinux经过objcoy后生成二进制文件Image,Image在经过gzip压缩后生成piggy.o
   piggy.o是真正的内核镜像文件

2 HEADER_PATH/head.o ,head-xscal.o ,misc.o 的作用就是把piggy.o解压到指定的位置,然后执行piggy.o解压后的代码


HEADER_PATH/zImage
       ^
       |[objcopy]
       |
HEADER_PATH/vmlinux
       ^
       |[ld]
       |
       +-<--HEADER_PATH/head.o
       |
       +-<--HEADER_PATH/head-xscal.o
       |
       +-<--HEADER_PATH/misc.o
       |
       +-<--HEADER_PATH/piggy.o <-- HEADER_PATH/piggy.gz <--[gzip]-- BOOT_PATH/Image <--[objcopy]--SRC_TREE/vmlinux

-----------------------------------------------------------------------------------------------------------------------
-----------------------------------------------------------------------------------------------------------------------

SRC_TREE目录下的vmlinux是由一下三部分组成的:

$(vmlinux-init)

$(vmlinux-main)

kallsyms.o

vmlinux
   ^
   |
   +-<--$(vmlinux-init)
   |          ^
   |          |
   |          +--<--KERNEL_PATH/head.S
   |          |
   |          +--<--KERNEL_PATH/init_task.o
   |          |
   |          +--<--SRC_TREE/init/build-in.o
   |        
   +--< $(vmlinux-main)
   |          ^
   |          |$(cory-y)
   |          +--<--SRC_TREE/driver/built-in.o
   |          |
   |          +--<--SRC_TREE/mm/built-in.o
   |          |
   |          +--<--SRC_TREE/usr/built-in.o
   |          |
   |          +--<--SRC_TREE/kernel/built-in.o
   |          |
   |          +--<--SRC_TREE/mm/built-in.o
   |          |
   |          +--<--SRC_TREE/fs/built-in.o
   |          |
   |          +--<--SRC_TREE/ipc/built-in.o
   |          |
   |          +--<--SRC_TREE/securiy/built-in.o
   |          |
   |          +--<--SRC_TREE/crypto/built-in.o
   |          |
   |          +--<--SRC_TREE/block/built-in.o
   |          |
   |          +--<--arch/arm/kernel/built-in.o
   |          |
   |          +--<--arch/arm/mm/built-in.o
   |          |
   |          +--<--arch/arm/common/built-in.o
   |          |
   |          +--<--arch/arm/mach-pxa/built-in.o
   |          |
   |          +--<--arch/arm/nwfpe/buit-in.o
   |          |
   |          |$(lib-y)
   |          +--<--SRC_TREE/lib/built-in.o
   |          |
   |          +--<--arch/arm/lib/built-in.o
   |          |
   |          |$(drivers-y)
   |          +--<--SRC_TREE/drivers/buit-in.o
   |          |
   |          +--<--SRC_TREE/sound/buit-in.o
   |          |
   |          |$(net-y)
   |          +--<--SRC_TREE/net/buit-in.o
   |
   +--< kallsyms.o

这篇关于vmlinux,vmlinuz,uImage,zImage,bzImage 之间的异同的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/795137

相关文章

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

linux中使用rust语言在不同进程之间通信

第一种:使用mmap映射相同文件 fn main() {let pid = std::process::id();println!(

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

16 子组件和父组件之间传值

划重点 子组件 / 父组件 定义组件中:props 的使用组件中:data 的使用(有 return 返回值) ; 区别:Vue中的data (没有返回值);组件方法中 emit 的使用:emit:英文原意是:触发、发射 的意思components :直接在Vue的方法中声明和绑定要使用的组件 小炒肉:温馨可口 <!DOCTYPE html><html lang="en"><head><

数据流与Bitmap之间相互转换

把获得的数据流转换成一副图片(Bitmap) 其原理就是把获得倒的数据流序列化到内存中,然后经过加工,在把数据从内存中反序列化出来就行了。 难点就是在如何实现加工。因为Bitmap有一个专有的格式,我们常称这个格式为数据头。加工的过程就是要把这个数据头与我们之前获得的数据流合并起来。(也就是要把这个头加入到我们之前获得的数据流的前面)      那么这个头是

【编程底层原理】方法区、永久代和元空间之间的关系

Java虚拟机(JVM)中的内存布局经历了几个版本的变更,其中方法区、永久代和元空间是这些变更中的关键概念。以下是它们之间的关系: 一、方法区: 1、方法区是JVM规范中定义的一个概念,它用于存储类信息、常量、静态变量、即时编译器编译后的代码等数据。 3、它是JVM运行时数据区的一部分,与堆内存一样,是所有线程共享的内存区域。 二、永久代(PermGen): 1、在Java SE 7之前,

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数

【鸿蒙HarmonyOS NEXT】页面之间相互传递参数 一、环境说明二、页面之间相互传参 一、环境说明 DevEco Studio 版本: API版本:以12为主 二、页面之间相互传参 说明: 页面间的导航可以通过页面路由router模块来实现。页面路由模块根据页面url找到目标页面,从而实现跳转。通过页面路由模块,可以使用不同的url访问不同的页面,包括跳转到U

Java利用正则表达式获取指定两个字符串之间的内容

package com.starit.analyse.util;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;public class DealSt

俩个float数之间比较大小

需求:俩个标识金额的浮点数比较大小。 问题:相等无法成立。经过var_dump()打印,俩个浮点数数值 一样大。 解决:把标识金额的浮点数乘以100,抓换成整形,在做比较。即可使相等成立