嵌入式Linux中几种image的区别

2019-07-12 15:09发布

  • vmlinux 编译出来最原始的内核文件,未经压缩。
  • zImage 由 vmlinux 经过 gzip 压缩而得。
      
      zImage 是由压缩后的 vmlinux 和解压缩程序组成。
  • bzImage bz表示“big zImage”,不是用bzip2压缩的。   zImage 和 bzImage 的区别在于,zImage 解压缩内核到低端内存(第一个640KB),bzImage解压缩内核到高端内存(1MB以上)。如果内核比较小,那么采用 zImage 或 bzImage 都行,如果比较大应该用 bzImage。
  • uImage U-Boot专用的映像文件。   uImage 是在 zImage 之前加上一个长度为 0x40 的 tag (64个字节,说明这个image文件的类型、加载位置、生成时间、大小等信息)。其实就是一个自动跟手动的区别,有了 uImage 头部的描述,uboot 就知道对应 image 的信息,如果没有头部则需要自己手动设置这些参数。换句话说,如果直接从 uImage 的 0x40 位置开始执行,zImage 和 uImage 没有任何区别。
      生成 uImage 需要用到 mkimage 工具,它位于相应版本的 uboot 源码根目录下的 tools 目录下,将 mkimage 复制到系统环境变量 bin 目录下。然后在内核目录下运行“make uImage”,我们发现 uImage 的大小比 zImage 多64个字节。
      
  • vmlinuz 是 bzImage/zImage 文件的拷贝或指向 bzImage/zImage 的链接。
  • initrd 是“initial ramdisk”的简写。一般被用于临时引导硬件到实际内核 vmlinuz 能够接管并继续引导的状态。   一般情况下,在生成 vmlinux 后,再对内核映像进行压缩成为 zImage 或 uImage,压缩的后的内核映像位于 arch/$(ARCH)/boot 目录下面。
      嵌入式开发,一般下载到 flash 中的是 zImage 或 uImage,zImage 可由 uboot 命令 bootzImage 引导,uImage 则可由 bootm 引导。
      假设内存映射的基址是 0x3000 0000 ,我们通过设置 bootcmd 为“ tftp 0x30008000 uImage; bootm 0x300080000”来下载并启动内核映像,那么 0x30008000 又是如何来的呢?这32KB(0x8000)的空间有什么用?
在内核文件 arch/arm/mach-s5pv210/Makefile.boot 中,有如下描述:
zreladdr-y += 0x30008000#内核自解压缩后的释放地址
params_phys-y := 0x30000100#内核启动参数的存放地址,