Image zImage vmlinuz
内核编译(make)之后会生成两个文件,一个Image,一个zImage, 其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。
uImage是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40(十进制为64)之后与zImage没区别
1.vmlinux
vmlinux是未压缩的内核, vmlinux 是ELF文件,即编译出来的最原始的文件。用于kernel-debug,产生system.map符号表,不能用于直接加载,不可以作为启动内核。只是启动过程中的中间媒体。
vmlinuz是Linux 内核的镜像文件,可以被引导程序加载,从而启动Linux系统
initrd----boot loader initialized RAM disk(全称)是一种启动Linux系统的方式
2.vmlinuz
vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz是可执行的Linux内核,它位于/boot/vmlinuz,它一般是一个软链接。但是,它已经丢失了调试信息等,不可用于调试,这就是为什么perf和systemtap等内核级别的调试软件安装的时候,需要重新编译内核的原因。同理,解压缩vmlinuz是不能得到Vmlinux的。相对于vmlinux,它增加了解压缩和boot的部分 。
3.zimage
zImage是vmlinuz经过gzip压缩后的文件,适用于小内核(512KB以内),加载到内存的开始640KB处。
4.bzimage(not bzizp but big)
bzImage是vmlinuz经过gzip压缩后的文件,适用于大内核。为什么会发明bzimage这种内核镜像呢?随着linux内核的成熟,linux内核大小逐渐增大,超过了一些体系结构的限制,导致存储压缩内核的空间受到限制。bzimage这种格式就是为了克服这种限制,它通过把kernel分解到不相邻的内存区域来达到这一个目的。
bzimage包含以下目标文件 bootsect.o + setup.o + misc.o + piggy.o .
bootsect:这个程序是linuxkernel的第一个程序,包括了linux自己的bootstrap程序,主要进行开机后加载真正内核镜像之前的各种准备工作.注意它是用来load bzimage,不是bzimage的一部分(这句话存在质疑)。
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.6.20-1.img是用gzip压缩的文件,initrd实现加载一些模块和安装文件系统等功能。
常会用到mkinitrd命令。而该命令其实是一个脚本,通过一系列的流程来生成系统启动需要的initrd.img文件。通过分析该文件,我们可以更清楚的知道系统启动时候加载驱动的顺序,以及修正或加入一些自定义的配置。
一、什么是initrd
initrd 的英文含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。initrd的最初的目的是为了把kernel的启动分成两个阶段:
在kernel中保留最少最基本的启动代码,然后把对各种各样硬件设备的支持以模块的方式放在initrd中,这样就在启动过程中可以从initrd所mount的根文件系统中装载需要的模块。这样的一个好处就是在保持kernel不变的情况下,通过修改initrd中的内容就可以灵活的支持不同的硬件。
在启动完成的最后阶段,根文件系统可以重新mount到其他设备上。
二、是否必须
initrd文件不是必须的,但对于像红旗这样,需要具有适应在不同的硬件环境下使用的要求,那使用initrd会更方便。
我们常在编译核心的使用,使用make menuconfig,其中对某些而外的驱动,是可以选择以模块编译,还是<*>直接编译到核心里面。例如ext3文件系统驱动,如果核心需要放在该文件系统上,可以有两个方法:
引用
1、把其全都编译到内核中,则只需要一个内核文件系统即可启动;
2、把其编译为模块,然后通过initrd虚拟的内存系统加载;
也就是说由于initrd会在内存虚拟一个文件系统,然后可以根据不同的硬件加载不同的驱动,而不需要重新编译整个核心。所以,大部分的发行版都会通过这种方式对驱动进行加载。
三、版本
根据核心版本的不同,initrd文件有两种格式:image和cpio。2.4核心只使用image格式,而2.6核心可同时支持两种格式。它们不单格式不一样,而且运作的机制和流程也完全不同,甚至制作方法也不一样。
下面,我就以红旗DC 4.1和红旗DC 5.0某机器上的initrd进行说明。
initrd映象文件是使用mkinitrd创建的。mkinitrd实用程序能够创建initrd映象文件。这个命令是RedHat专有的。其它
Linux发行版或许有相应的命令。这是个很方便的实用程序。具体情况请看帮助:man mkinitrd下面的命令创建initrd映象文件。
initrd是linux在系统引导过程中使用的一个临时的根文件系统,用来支持两阶段的引导过程。
直白一点,initrd就是一个带有根文件系统的虚拟RAM盘,里面包含了根目录‘/’,以及其他的目录,比如:bin,dev,proc,sbin,sys等linux启动时必须的目录,以及在bin目录下加入了一下必须的可执行命令。
PC或者服务器linux内核使用这个initrd来挂载真正的根文件系统,然后将此initrd从内存中卸掉,这种情况下initrd其实就是一个过渡使用的东西。在现在的许多简单嵌入式linux中一般是不卸载这个initrd的,而是直接将其作为根文件系统使用,在这之前就需要把所需要的程序,命令还有其它文件都安装到这个文件系统中。其实现在的大多数嵌入式系统也是有自己的磁盘的,所以,initrd在现在大多数的嵌入式系统中也和一般的linux中的作用一样只是起过渡使用。
Initrd的引导过程:‘第二阶段引导程序’,常用的是grub将内核解压缩并拷贝到内存中,然后内核接管了CPU开始执行,然后内核调用init()函数,注意,此init函数并不是后来的init进程!!!然后内核调用函数 initrd_load()来在内存中加载initrd根文件系统。Initrd_load()函数又调用了一些其他的函数来为RAM磁盘分配空间,并计算CRC等操作。然后对RAM磁盘进行解压,并将其加载到内存中。现在,内存中就有了initrd的映象。
然后内核会调用mount_root()函数来创建真正的根分区文件系统,然后调用sys_mount()函数来加载真正的根文件系统,然后chdir到这个真正的根文件系统中。
最后,init函数调用run_init_process函数,利用execve来启动init进程,从而进入 init的运行过程。
System.map
内核符号映射表,顾名思义就是将内核中的符号(也就是内核中的函数)和它的地址能联系起来的一个列表。是所有符号及其对应地址的一个列表。之所以这样就使为了用户编程方便,直接使用函数符号就可以了,而不用去记要使用函数的地址。 当你编译一个新内核时,原来的System.map中的符号信息就不正确了。随着每次内核的编译,就会产生一个新的 System.map文件,并且需要用该文件取代原来的文件
Image zImage vmlinuz相关推荐
- 比较zImage和uImage的区别
一.vmlinuz vmlinuz是可引导的.压缩的内核."vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS有6 ...
- 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装
这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...
- vmlinuz、initrd.img、vmlinuz
一.vmlinuz 1.vmlinuz是可引导的.压缩的内核."vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS ...
- 编译linux内核成vmlinuz,Linux内核编译与安装
原标题:Linux内核编译与安装 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统,内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一 ...
- linux中Image、zImage、bzImage、uImage、vmlinux和vmlinux的区别
(1)vmlinux:是内核编译出来的原始的内核文件未经压缩的.是ELF格式的,即编译出来的最原始的文件.用于kernel-debug,产生system.map符号表,不能用于直接加载,不可以作为启动 ...
- initrd映像文档的作用和制作
RePrint:http://hi.baidu.com/wangpeng1314/blog/item/212e9e1752377f064b90a7f5.html 我们在安装新内核的时候,通常都会编辑l ...
- linux 为什么编译内核,Linux内核编译与安装
导读 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统,内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一大特点就是采用了整体式结构, ...
- ELF文件和BIN文件
文件的内容: 1. BIN文件是 raw binary 文件,这种文件只包含机器码. 2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等. 所以ELF文件 ...
- 编译 linux 3,linux内核的编译(3)
linux内核的编译(3) 2008-02-23 07:17:46来源:互联网 阅读 () 无论什麽档名),然後将你做的 zImage 拷贝进去,(例如,如果你用" /vmlinuz ″ 的 ...
- 内核与ramdisk到底是什么关系
转自:http://www.lupaworld.com/forum.php?mod=viewthread&tid=61425 ref: http://smilejay.com/2013/06 ...
最新文章
- 5G、物联网和AI结合的究极形态是什么?一文看尽智能连接在5大领域的12个典型案例!...
- 对一个伪装成微信的加固病毒的分析
- Keil精确测量代码运行时间
- 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)...
- python创建数组并运行,python中Numpy的数组创建
- 千万数据去重_mysql去重,3亿多数据量
- VS编译时使用/去除NuGet管理库
- Windows MobileCE 开发书籍大全
- 有哪些典型的「学生思维」?
- 中文乱码之springboot框架中两工程之间参数传递乱码
- Linux服务器数据库的导入和导出
- Python3 GUI编程: 自带图形库 tkinter 学习教程
- 【CVPR2020】计算机视觉与模式识别会议论文完全清单_Part2
- 学术论文参考文献格式
- 女生做软件测试的职业规划,来说说女程序员的职业规划要怎么做
- YARN-ResourceManager重启
- spring security中A granted authority textual representation is required
- 如何获取股票交易接口
- 如何获取当前配置的IPV6地址的前缀长度(掩码)
- 协同OA行业五大关键词