内核编译(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相关推荐

  1. 比较zImage和uImage的区别

    一.vmlinuz vmlinuz是可引导的.压缩的内核."vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS有6 ...

  2. 编译Linux内核没有zImage,Linux 编译系统的简单介绍与内核编译安装

    这里不只是讲怎样编译.安装Linux内核的,更主要的是介绍内核的编译系统和各个重要的文件.最后还利用学到的编译.安装Linux内核去修改Linux的01调度变成随机调度.如果你只是需要编译.安装内核的 ...

  3. vmlinuz、initrd.img、vmlinuz

    一.vmlinuz 1.vmlinuz是可引导的.压缩的内核."vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS ...

  4. 编译linux内核成vmlinuz,Linux内核编译与安装

    原标题:Linux内核编译与安装 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统,内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一 ...

  5. linux中Image、zImage、bzImage、uImage、vmlinux和vmlinux的区别

    (1)vmlinux:是内核编译出来的原始的内核文件未经压缩的.是ELF格式的,即编译出来的最原始的文件.用于kernel-debug,产生system.map符号表,不能用于直接加载,不可以作为启动 ...

  6. initrd映像文档的作用和制作

    RePrint:http://hi.baidu.com/wangpeng1314/blog/item/212e9e1752377f064b90a7f5.html 我们在安装新内核的时候,通常都会编辑l ...

  7. linux 为什么编译内核,Linux内核编译与安装

    导读 Linux内核是一个用C语言写成的,符合POSIX标准的类Unix操作系统,内核是操作系统中最基本的一部分,提供了众多应用程序访问计算机硬件的机制.Linux内核的一大特点就是采用了整体式结构, ...

  8. ELF文件和BIN文件

    文件的内容: 1. BIN文件是 raw binary 文件,这种文件只包含机器码. 2. ELF文件除了机器码外,还包含其它额外的信息,如段的加载地址,运行地址,重定位表,符号表等. 所以ELF文件 ...

  9. 编译 linux 3,linux内核的编译(3)

    linux内核的编译(3) 2008-02-23 07:17:46来源:互联网 阅读 () 无论什麽档名),然後将你做的 zImage 拷贝进去,(例如,如果你用" /vmlinuz ″ 的 ...

  10. 内核与ramdisk到底是什么关系

    转自:http://www.lupaworld.com/forum.php?mod=viewthread&tid=61425 ref:  http://smilejay.com/2013/06 ...

最新文章

  1. 5G、物联网和AI结合的究极形态是什么?一文看尽智能连接在5大领域的12个典型案例!...
  2. 对一个伪装成微信的加固病毒的分析
  3. Keil精确测量代码运行时间
  4. 关于上个Flex-Jsp-DB例子中Flex和Jsp传递中文参数问题的解决方法!(Tomcat服务器)...
  5. python创建数组并运行,python中Numpy的数组创建
  6. 千万数据去重_mysql去重,3亿多数据量
  7. VS编译时使用/去除NuGet管理库
  8. Windows MobileCE 开发书籍大全
  9. 有哪些典型的「学生思维」?
  10. 中文乱码之springboot框架中两工程之间参数传递乱码
  11. Linux服务器数据库的导入和导出
  12. Python3 GUI编程: 自带图形库 tkinter 学习教程
  13. 【CVPR2020】计算机视觉与模式识别会议论文完全清单_Part2
  14. 学术论文参考文献格式
  15. 女生做软件测试的职业规划,来说说女程序员的职业规划要怎么做
  16. YARN-ResourceManager重启
  17. spring security中A granted authority textual representation is required
  18. 如何获取股票交易接口
  19. 如何获取当前配置的IPV6地址的前缀长度(掩码)
  20. 协同OA行业五大关键词

热门文章

  1. 语音合成(TTS)应用方案一二三
  2. MAC python版本选择实现版本切换
  3. Ubuntu下Vim的常用操作命令——vi编辑器常用命令
  4. 直播源批量生成小工具.c
  5. python画折线图两种写法
  6. 很漂亮动态个人主页自带音乐源码
  7. Window下完全卸载MySQL教程
  8. js代码跳转页面时的路径问题
  9. 工作效率提升100%,程序员必备神级工具
  10. php 加密视频播放地址,如何在PHP中实现Clear-Key视频加密并以HTML格式播放