vmlinux,vmlinuz,uImage,zImage,bzImage之间的异同
- 格式:doc
- 大小:28.00 KB
- 文档页数:2
linux的几个内核镜像格式Image和u-boot启动内核和文件系统时的一些环境变量的设置关于编译powerpc linux的几个Image参考原文 /s/blog_86a30b0c0100wfzt.html转载▼PowerPC架构 Linux和ARM,X86等平台有些差异,PowerPC平台HW参数不是通过命令行方式传递到Linux,而是通过传递Device tree文件的方式传递参数,所以PowerPC平台Linux需要编译dtb和uImage才能正常加载,另外PowerPC架构linux还提供simpleImage的方式加载,也就是将dtb与uImage或将dtb,uImage 与ramdisk.image.gz多个文件整合生产单个simpleImage文件,这种simpleImage文件加载方式适合于没有bootloader支持的情况下,通过JTAG将simpleImage直接加载到target board内存中运行,对于调试非常方便,下面说说这几种Image文件的编译:1,dtb:dtb文件由dts生成,对于任何一个PowerPC处理器板,都要有对应的dts文件,dts文件主要是对目标板的HW参数进行描述,比如我的目标板是evm440(Powerpc440),我编写了一个evm440.dts文件放到内核arch/powerpc/boot/dts/目录下.编译evm440.dtb文件命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- evm440.dtb编译成功后会在arch/powerpc/boot/下生成evm440.dtb文件,这就是我们需要的dtb文件.2. uImage:这个Image应该是地球都知道的,这里就不多说了,编译命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- uImage编译成功后会在arch/powerpc/boot/下生成uImage文件,这就是我们需要的内核Image文件.3. simpleImage.xxxx和simpleImage.initrd.xxxx:这里的xxxx是特定目标板名字,我的目标板是evm440,也就是simpleImage.evm440和simpleImage.initrd.evm440。
arm linux recovery 原理ARM Linux恢复原理ARM是一种广泛应用于移动设备、嵌入式系统和其他低功耗设备的处理器架构。
在ARM Linux恢复原理中,我们将重点关注如何恢复ARM架构上运行的Linux操作系统。
恢复ARM Linux的原理主要涉及以下几个方面:1. 引导加载程序(Bootloader):恢复ARM Linux的第一步是确保正确的引导加载程序已被加载到设备的内存中。
引导加载程序负责初始化硬件并加载操作系统内核。
常见的ARM引导加载程序包括U-Boot和GRUB。
2. 操作系统内核:恢复ARM Linux需要正确的操作系统内核镜像。
内核是操作系统的核心部分,负责管理系统资源、驱动硬件设备、执行任务调度等功能。
内核镜像通常以uImage或zImage格式存在,并包含设备树(Device Tree)等必要的配置信息。
3. 文件系统:恢复ARM Linux还需要正确的文件系统镜像。
文件系统是用来组织和管理文件数据的方法。
常见的ARM Linux文件系统包括EXT4、Btrfs和SquashFS等。
4. 恢复过程:具体的恢复过程可以根据恢复原因和需求而不同。
一般情况下,恢复ARM Linux可能包括以下步骤:- 加载引导加载程序:将引导加载程序加载到设备的内存中,使其能够启动。
- 初始化硬件:引导加载程序负责初始化设备上的硬件资源,如内存控制器、外设等。
- 加载内核镜像:引导加载程序从存储介质(如闪存或SD卡)中读取并加载内核镜像到设备的内存中。
- 启动内核:引导加载程序将控制权交给内核,使其开始执行。
- 挂载文件系统:内核根据设备树中的配置信息将文件系统镜像挂载到指定的挂载点上。
- 运行用户空间:内核启动后,会启动用户空间程序,提供各种应用服务。
ARM Linux恢复原理是确保设备能够正常启动和运行,保障系统的可靠性和稳定性。
了解ARM Linux恢复原理有助于开发人员和系统管理员在设备遇到故障或异常情况时进行相应的维护和修复。
Linux中有几个分区?分别是什么?在Linux系统中,默认可分为三个分区,分别是:boot分区、swap分区、根分区,接下来小编通过这篇文章详细为大家介绍一下这三个分区。
1、boot分区在Linux中,boot是存储内核及在引导过程中使用文件的分区,是启动Linux时使用的一些核心文件;在boot中包括了系统kernel的配置文件、启动管理程序GRUB的目录、启动时的模块供应的主要来源Initrd文件和vmlinuz文件。
/boot分区就是操作系统的内核及在引导过程中使用的文件,一般是几年前的版本要求划分的一个区,大小为100MB左右,但现在的新版本都不需要对这个分区进行单独划分,也就是说你完全可以不分/boot。
安装Linux只要求两个基本分区,即根分区及交换分区,如果你的磁盘空间足够大,可以多划分空间给根分区,你也可以把常用的目录新建到桌面,如下载的软件包,放到桌面不影响你进入Linux系统的速度,当然这要求你有足够大的根分区。
2、swap分区swap就是Linux下的虚拟内存分区,它的作用是在物理内存使用完之后,将磁盘空间虚拟成内存来使用。
它和Windows系统的交换文件作用类似,但是它是一段连续的磁盘空间,并且对用户不可见。
需要注意的是,虽然这个swap分区能够作为虚拟的内存,但它的速度比物理内存可是慢多了,因此如果需要更快的速度的话,并不能寄厚望于SWAP,最好的办法仍然是极大物理内存。
SWAP分区只是临时的解决办法。
交换分区的合理值一般在内存的2倍左右?一种流行的说法是,安装Linux系统时,交换分区swap的大小应该是内存的两倍。
也就是说,如果内存是2G,那么就应该分出4G的硬盘空间作为交换空间。
其实这是严重的浪费。
真实的情况是:可以根据你系统内存的大小,以及所使用的程序,自行决定交换分区的大小,甚至可以完全不用交换分区。
3、根分区所谓根分区,说白了就是系统分区,是root分区,所有的东西都放在这里面。
Linux内核源码分析--内核启动之zImage⾃解压过程阅读⽬录(Content)参考:⽂档下载地址:关于内核⾃解压完毕后,执⾏start_kernel的分析,参见:内核版本:3.0.8相关⽂件:arch/arm/boot/compressed/head.Sarch/arm/boot/compressed/vmlinux.ldsarch/arm/boot/compressed/piggy.gzip这⾥仅对内核⾃解压进⾏简要分析,详细的分析可以阅读参考博客⽂档。
zImage来历顶层vmlinux ---->arch/arm/boot/Image --->arch/arm/boot/compressed/piggy.gz --->arch/arm/boot/compressed/vmlinux --->arch/arm/boot/zImage如果要分析zImage的反汇编反汇编⽂件,可将arch/arm/boot/compressed/vmlinux进⾏反汇编,arm-linux-xxx-objdump –d vmlinux > vmlinux.dis对顶层的vmlinux反汇编得到的是未压缩的内核的反汇编⽂件,这个vmlinux才是真正的Linux内核。
piggy.gz压缩⽂件的特点gzip -f -9 < Image > piggy.gz在piggy.gz的结尾四个字节表⽰的是 Image 镜像的⼤⼩,并且是以⼩端格式存放的。
下⾯我们验证⼀下:可以看到,Image的⼤⼩是6806148B,⼗六进制值就是67DA84,接下来看看piggy.gz的结尾:可以看到,确实是将0x67DA84以⼩端的格式存放在了piggy.gz的结尾四字节中了。
vmlinux.lds1: /*2: * linux/arch/arm/boot/compressed/vmlinux.lds.in3: *4: * Copyright (C) 2000 Russell King5: *6: * This program is free software; you can redistribute it and/or modify7: * it under the terms of the GNU General Public License version 2 as8: * published by the Free Software Foundation.9: */10: OUTPUT_ARCH(arm)11: ENTRY(_start)12: SECTIONS13: {14: /DISCARD/ : {15: *(.ARM.exidx*)16: *(.ARM.extab*)17: /*18: * Discard any r/w data - this produces a link error if we have any,19: * which is required for PIC decompression. Local data generates20: * GOTOFF relocations, which prevents it being relocated independently21: * of the text/got segments.22: */23: *(.data)24: }25:26: . = 0;27: _text = .;28:29: .text : {30: _start = .;31: *(.start)32: *(.text)33: *(.text.*)34: *(.fixup)35: *(.gnu.warning)36: *(.rodata)37: *(.rodata.*)38: *(.glue_7)39: *(.glue_7t)40: *(.piggydata)41: . = ALIGN(4);42: }43:44: _etext = .;45:46: _got_start = .;47: .got : { *(.got) }48: _got_end = .;49: .got.plt : { *(.got.plt) }50: _edata = .;51:52: . = ALIGN(8);53: __bss_start = .;54: .bss : { *(.bss) }55: _end = .;56:57: . = ALIGN(8); /* the stack must be 64-bit aligned */58: .stack : { *(.stack) }59:60: .stab 0 : { *(.stab) }61: .stabstr 0 : { *(.stabstr) }62: .stab.excl 0 : { *(.stab.excl) }63: .stab.exclstr 0 : { *(.stab.exclstr) }64: .stab.index 0 : { *(.stab.index) }65: .stab.indexstr 0 : { *(.stab.indexstr) }66: .comment 0 : { *(.comment) }67: }68:arch/arm/boot/compressed/head.S1: .section ".start", #alloc, #execinstr2: /*3: * 清理不同的调⽤约定4: */5: .align6: .arm @ 启动总是进⼊ARM状态7: start:8: .type start,#function9: .rept 710: mov r0, r011: .endr12: ARM( mov r0, r0 )13: ARM( b 1f )14: THUMB( adr r12, BSYM(1f) )15: THUMB( bx r12 )16: .word 0x016f2818 @ ⽤于boot loader的魔数17: .word start @ 加载/运⾏zImage的绝对地址(编译时确定), 在vmlinux.lds中可以看到,zImage的链接起始地址是018: .word _edata @ zImage结束地址,分析vmlinux.lds可以看到,_edata是 .got 段的结束地址,后⾯紧接的就是.bss段和.stack段 19: THUMB( .thumb )20: 1: mov r7, r1 @ 保存构架ID到r7(此前由bootloader放⼊r1)21: mov r8, r2 @ 保存内核启动参数地址到r8(此前由bootloader放⼊r2)22: #ifndef __ARM_ARCH_2__23: /*24: * 通过Angel调试器启动 - 必须进⼊ SVC模式且关闭FIQs/IRQs25: * (numeric definitions from angel arm.h source).26: * 如果进⼊时在user模式下,我们只需要做这些27: */28: mrs r2, cpsr @ 获取当前模式29: tst r2, #3 @ 判断是否是user模式30: bne not_angel31: mov r0, #0x17 @ angel_SWIreason_EnterSVC32: ARM( swi 0x123456 ) @ angel_SWI_ARM swi会产⽣软中断,会跳⼊中断向量表,这个向量表⽤的是bootloader的,因为在head.S中并没有建⽴新的向量表33: THUMB( svc 0xab ) @ angel_SWI_THUMB34: not_angel:35: mrs r2, cpsr @ 关闭中断36: orr r2, r2, #0xc0 @ 以保护调试器的运作关闭IRQ和FIQ37: msr cpsr_c, r238: #else39: teqp pc, #0x0c000003@ 关闭中断(此外bootloader已设置模式为SVC)40: #endifGOT表是什么?GOT(Global Offset Table)表中每⼀项都是本运⾏模块要引⽤的⼀个全局变量或函数的地址。
VMware虚拟机及各种版本Linux操作系统安装详解一、启动虚拟机,如下图所示,点击“新建虚拟机”。
二、点击“下一步”,选择“自定义”,点击“下一步”,如下图所示。
三、选择“Workstation 6”,点击“下一步”。
如下图所示。
四、选择“Linux”,如果是RedHat系统,则选择RedHat Linux;如果是Ubuntu系统,则选择Ubuntu;如果是Fedora系统,版本选择“Other Linux 2.6.x kernel”。
点击“下一步”。
如下图所示。
五、虚拟机名称自定,文件存储位置自定。
点击“下一步”。
六、虚拟处理器数量一般选一个,除非你的电脑的主板上有两块CPU。
点击“下一步”。
七、在内存分配方面,Linux操作系统的KDE桌面环境比较占资源,因此最好分配256MB 的内存给虚拟机使用。
点击“下一步”。
八、接下来配置网络连接,如果有联网需要,一般选择“使用网络地址转换(NAT)”。
点击“下一步”。
如下图所示。
九、SCSI 适配器选择“LSI Logic”。
如果选择“总线”并且使用虚拟的SCSI硬盘,安装某些版本的Linux系统时会提示说找不到可用硬盘。
点击“下一步”。
如下图所示。
十、选择“创建一个新的虚拟磁盘”。
不推荐“使用一个物理磁盘”。
点击“下一步”。
如下图所示。
十一、虚拟机磁盘类型选择“SCSI”。
点击“下一步”。
如下图所示。
十二、对于Linux来说,如果不安装工具盘,则分配5.5GB的磁盘空间足矣。
点击“下一步”。
如下图所示。
十三、指定磁盘文件,一般按默认,点击“完成”开始创建磁盘文件。
完成后如下图所示。
十四、如果使用光盘镜像来安装Linux,则点击“编辑虚拟机设置”,在“硬件”标签页中点击“CD-ROM1(IDE 1:0)”,勾选右侧的“使用ISO 映象”,点击“浏览”选择ISO文件,点击“打开”即可。
如下图所示。
如果已经将ISO文件刻录成光盘,则将光盘放入光驱,点击“启动此虚拟机”,点击黑色背景的启动界面,让虚拟机捕获鼠标,按下F2键进入虚拟机的BIOS设置界面,按光标键的右箭头移到“Boot”标签页,按光标键的下箭头选择“CD-ROM Drive”,按数字键盘区的加号键将“CD-ROM Drive”移到第一位。
vmlinux生成流程vmlinux是Linux内核的可执行文件,它是内核源代码经过编译、链接等一系列处理后生成的。
下面我们将详细介绍vmlinux生成的流程。
1. 内核源代码编译vmlinux的生成过程首先需要对Linux内核的源代码进行编译。
编译器将源代码翻译成机器可以执行的目标代码,生成一系列的中间文件。
在编译过程中,需要注意选择合适的编译选项,以及处理一些与平台相关的代码。
2. 汇编代码生成在编译过程中,还会生成一些汇编代码。
汇编代码是与机器硬件直接相关的代码,它负责处理底层的硬件操作。
汇编代码一般保存在以".S"为后缀的文件中。
3. 链接过程编译完源代码和汇编代码后,需要进行链接操作。
链接器将各个模块的目标代码组合在一起,解析符号引用,生成最终的可执行文件。
在链接过程中,还需要处理一些与库相关的操作,如动态链接库和静态链接库的链接。
4. 符号表生成在链接过程中,还会生成符号表。
符号表是一个记录了各个符号(函数、变量等)地址和大小的表格,它有助于调试和动态加载等操作。
符号表一般保存在可执行文件的调试信息中。
5. 优化处理在生成vmlinux的过程中,还需要进行一些优化处理。
优化处理旨在提高代码的执行效率,减少资源占用。
优化处理涉及到很多技术,如代码折叠、循环展开、指令调度等。
6. 生成vmlinux经过以上的编译、汇编、链接和优化处理,最终可以生成vmlinux文件。
vmlinux是一个可执行的二进制文件,它包含了Linux内核的所有代码和数据。
vmlinux可以被直接加载到内存中执行,成为一个运行的操作系统。
总结:vmlinux的生成过程经历了源代码编译、汇编代码生成、链接过程、符号表生成、优化处理等多个阶段。
通过这些处理,我们可以得到一个完整的可执行的Linux内核文件。
vmlinux的生成过程是复杂而严谨的,需要编译器、链接器等工具的支持,同时也需要开发人员对内核源代码和底层硬件有深入的理解。
Image、uImage、zImage、bzImage、vmlinuz和vmlinux的区别内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。
uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。
64字节的头结构如下:typedef struct image_header {uint32_tih_magic;uint32_tih_hcrc;uint32_tih_time;uint32_tih_size;uint32_tih_load;uint32_tih_ep;uint32_tih_dcrc;uint8_tih_os;uint8_tih_arch;uint8_tih_type;uint8_tih_comp;uint8_tih_name[IH_NMLEN];} image_header_t;所以,uImage和zImage都是压缩后的内核映像。
而uImage是用mkimage工具根据zImage制作而来的。
mkimage工具介绍如下:u-boot里面的mkimage工具来生成uImage(u-boot源码包/tools/mkimage.c )这里解释一下参数的意义:-A ==> set architecture to 'arch'-O ==> set operating system to 'os'-T ==> set image type to 'type' “kernel或是ramdisk”-C ==> set compression type 'comp'-a ==> set load address to 'addr' (hex)-e ==> set entry point to 'ep' (hex)(内核启动时在此位置查询完整的内核印象)-n ==> set image name to 'name'-d==> use image data from 'datafile'-x ==> set XIP (execute in place,即不进行文件的拷贝,在当前位置执行)对于ARM linux内核映象用法:-A arm -------- 架构是arm-O linux -------- 操作系统是linux-T kernel -------- 类型是kernel-C none/bzip/gzip -------- 压缩类型-a 20008000 ---- image的载入地址(hex),通常为0xX00008000-e 200080XX---- 内核的入口地址(hex),XX为0x40或者0x00 -n linux-XXX --- image的名字,任意-d nameXXX ---- 无头信息的image文件名,你的源内核文件uImageXXX ---- 加了头信息之后的image文件名,任意取原来在这个-C这个参数这里不太理解,因为我觉得既然mkimage是用zImage去制作uImage,而本身zImage就是经过压缩了的,为什么这个地方还要有一个压缩了,后来想了下,觉得可能是这个工具也可以根据最原始的Image去制作uImage,所以就有了这个参数,不深究。
在ubuntu12.04下编译linux内核写这个东西的时候,想起07年第一次编译内核,想起06年开始看内核代码,想起那段,生命中最灰暗的日子。
那时,经常在校内写读内核的心得,只因发现,你目录前言 (2)一、编译前的准备工作 (2)二、内核的配置 (2)三、内核的生成和安装 (3)四、启动新内核 (4)五、修改默认的配置文件 (4)5.1修改默认配置添加软件功能 (4)5.2修改默认配置添加pci和usb设备驱动 (5)5.3修改默认配置添加杂类设备驱动 (7)前言编译内核和编译其它软件相比,除了配置之外,没有什么特别的地方。
既然编译内核这么简单,网上也能找到很多介绍的文章,我为什么还要写呢?因为看到有些文章源自不断抄袭旧东西,导致抄了些没用的东西,而且基本都对内核配置避而不谈,这样实际上一定会有人遇到问题。
所以,写点吧,给初学者。
一、编译前的准备工作编译软件需要先安装编译环境,主要的就是工具链(toolchain)。
由于安装包需要下载的数据量较大,所以如果软件源建议还是换成国内的吧。
我用163的源,source.list文件在这里,覆盖/etc/apt/source.list就行了。
替换源后,执行如下命令:apt-get updateapt-get install build-essential p7zip-full后面的7z工具供下载了xz后缀文件的同学使用。
下载内核源码的网站是,版本随意,源码包名字是linux-3.x.x.tar.gz,有很多版本提供.xz结尾的压缩版本,压缩比较高,看自己网络情况定吧。
我这里下载的版本是3.6.6,名为linux-3.6.6.tar.gz。
接着解压源码,假设我们的编译目录为/home/sb/,解压命令为:tar xf linux-3.6.6.tar.gz-C/home/sb这样/home/sb/下出现一个linux-3.6.6的目录。
二、内核的配置内核支持很多的设备和功能,这些设备驱动和功能的开关主要通过内核的配置文件确定。
编译Linux内核实验目的学习重新编译Linux内核,理解、掌握Linux内核和发行版本的区别。
实验内容重新编译内核是一件比你想像的还要简单的事情,它甚至不需要你对内核有任何的了解,只要你具备一些基本的Linux操作系统的知识就可以进行。
本次实验,要求你在RedHat Fedora Core 5的Linux系统里,下载并重新编译其内核源代码(版本号KERNEL-2.6.15-1.2054);然后,配置GNU的启动引导工具grub,成功运行你刚刚编译成功的Linux内核。
实验提示Linux是当今流行的操作系统之一。
由于其源码的开放性,现代操作系统设计的思想和技术能够不断运用于它的新版本中。
因此,读懂并修改Linux内核源代码无疑是学习操作系统设计技术的有效方法。
本实验首先介绍Linux内核的特点、源码结构和重新编译内核的方法,讲述如何通过Linux系统所提供的/proc虚拟文件系统了解操作系统运行状况的方法。
最后,对Linux编程环境中的常用工具也有简单介绍。
1.1查找并且下载一份内核源代码我们知道,Linux受GNU通用公共许可证(GPL)保护,其内核源代码是完全开放的。
现在很多Linux的网站都提供内核代码的下载。
推荐你使用Linux的官方网站: ,如图1-1。
在这里你可以找到所有的内核版本。
图1-1 Linux的官方网站由于作者安装的Fedora Core 5并不附带内核源代码,第一步首先想办法获取合适版本的Linux内核代码。
通过命令# uname –r2.6.15-1.2054_FC5这就是说,RedHat Fedora Core 5采用的内核版本是2.6.15-1.2054_FC5。
但是,官方网站/pub/linux/kernel/找不到对应版本。
请别着急,既然它是RedHat发布的,RedHat的官方网站总有吧。
浏览/pub/fedora/linux/core/5/source/SRPMS,我们发现果然有文件kernel-2.6.15-1.2054_FC5.src.rpm,这个rpm文件就是2.6.15-1.2054_FC5版的内核源代码了。
vmlinux,vmlinuz,uImage,zImage,bzImage之间的异同
2010-10-04 13:43:58
标签: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。
开机就运行。