关于 mkimage

在嵌入式系统中,Linux内核和根文件系统一般都与bootloader一起烧写在flash芯片中,系统启动后,bootloader将Linux内核压缩到RAM中,并把压缩的根文件系统复制到RAM中,然后启动内核,由内核解压缩根文件系统,并调用文件系统中的应用程序和脚本文件启动系统。

在烧写Linux内核和根文件系统之前应该对它们进行适当处理,在它们的头部加入一些提供给bootloader的信息字符,以便bootloader能够辨认它们并获取它们的信息,从而正确地将它们解压缩、复制到RAM中的正确位置,并正确启动内核。这个为Linux内核和根文件系统添加头部的工作一般由编译bootloader时生成的一个小应用程序来完成,比如u-boot编译后会在其tools子目录下生成一个叫mkimage的应用程序,而cfe在编译后也会在其cfe/hosttools子目录下生成一个叫mkflashimage的应用程序,它们就是完成上述功能的工具程序,此处我们只介绍u-boot的mkimage。

mkimage命令格式如下:

# mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

其中各字段含义如下:

 


    


    


-x


指定内核就在Flash中运行,即XIP(execute in place)


-T


指定输入文件的类型,如“kernel”、“filesystem”、“firmware”、“ramdisk”


-A


指定处理器体系架构


-O


指定操作系统类型名字,如“linux”、“vxworks”、“psos”等


-C


指定压缩模式,可能设置为“none”、“bzip2”、“gzip”


-a


指定程序被解压缩或复制到RAM中的地址


-e


指定程序(内核)的入口地址


-n


指定image文件的名字


-d


指定输入的程序文件,可是有多个文件,如内核或/和根文件系统二进制文件


image


输出文件名

mkimage命令举例如下:

#mkimage -n "My Kernel" -A arm -O linux -T kernel -C gzip –a 0x8000 –e 0x8000 -d kernel.gz kernel.img

以上命令将压缩了的内核二进制文件kernel.gz转换成u-boot能够辨认的二进制文件kernel.img,并指定kernel.img的名字为“My Kernel”,处理器体系架构为arm,操作系统类型为linux,程序类型为操作系统内核,程序由gzip压缩,程序的链接起始地址为0x8000,程序的入口地址为0x8000,注意这两个地址一定要是物理地址而不是对应的虚拟地址。

#mkimage -n "My Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

以上命令将压缩了的ramdisk根文件系统二进制文件ramdisk.gz转换成u-boot能够辨认的二进制文件ramdisk.img,并指定ramdisk.img的名字为“My Rootfs”,处理器体系架构为arm,操作系统类型为linux,程序类型为ramdisk,程序由gzip压缩,不需要指定ramdisk的链接起始地址和入口地址。

如果我们将kernel.img和ramdisk.img文件分别写到flash芯片的0xFF000000和0xFF200000位置,系统启动后进入u-boot命令行界面,执行以下u-boot命令:

# bootm 0xFF000000 0xFF200000

那么u-boot将把0xFF000000位置的Linux内核解压缩到RAM中的0x8000位置,再将0xFF200000位置的ramdisk文件系统映像文件刨掉u-boot头部后复制到RAM中的某个位置,然后跳转到内核的入口地址0x8000位置启动内核,同时把板子信息、ramdisk在RAM中的起始地址和结束地址、命令行字符串传给内核,这样Linux开始启动运行。

时间: 2024-12-21 19:34:49

关于 mkimage的相关文章

mkimage的-a 和 –c参数和内核引导

目录 一.mkimage工具简介二.-a参数与-e参数和内核引导的关系三.实例测试 3.1 -a参数与-e参数相同,可以将内核下载到SDRAM的任何地址,然后从这启动 3.2 -a参数与-e参数不同,只能将内核下载到-a参数后面的地址,然后从这启动:否则无法引导内核 3.3 -a参数与-e参数不同,下载地址和-a参数后面的地址不同(无法引导) 3.4 覆盖了U-Boot传给内核的参数,会导致这样情形(无法引导) 一.mkimage工具简介 U-Boot源代码的tools/目录下有mkimage工

mkimage使用详解

uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么 root@Glym:/tftpboot# ./mkimageUsage: ./mkimage -l image-l ==> l

uboot mkimage使用详解

mkimage使用详解uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件. mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置, 入口点在内存的那个位置以及映象名是什么root@Glym:/tftpboot# ./mkimageUsage: ./mkimage -l ima

U-boot mkimage指定Linux内核地址时的两种方式

uImage的制作是使用的u-boot工具mkimage,build完u-boot后也会将mkimage build出來到/tools目录下,可以直接拿來用,它的作用就是在zImage的前面加上64个字节的头,让u-boot能够识别要加载内核的类型.加载地址等. 基本格式:mkimage -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image -A 指定CPU的体系结构:(u-bo

Linux内核编译时会遇到的问题--缺少mkimage

由于各大平台所带的内核不同,所以编译方式也不同,但方法都是大同小异. 但是,编译内核有时候会提示缺少mkimage这个命令,如何解决? 供应商提供内核的同时也会提供其它的一些,比如Uboot,rootfs等等. 这个mkimage来自于对应的uboot源码包里,对uboot源码包进行解压后,编译uboot,后面会生成uboot.bin 然后在tool目录下: ls mkimage 我们可以看到有mkimgae这个工具生成. 接着,我们用cp命令:cp   mkimage  /usr/bin  接

MiniGUI + Hi3531 笔记 .

一.移动光驱安装Ubuntu 10.04      1.   重启系统按住Delete进入BIOS界面!      2.   退出/高级模式 --> 启动 --> 启动设备选择. 移动光驱正常被识别后这里应该是有2个选项的:            (1)SATA :WOC WD6401AALS-00E3A0 (默认硬盘)            (2)TSSTcorp CDDVDW SE-208AB TS00 (移动光驱)            我们直接点击(2)启动读取移动光驱中的光盘, 耐心

how to create owned centos base image on centos

一般情况下, 我们需要制作image的话, 总需要一个基本的image, 那么这个base image是哪里来的呢? 如果不自制的话, 那就得去docker HUB下载. 其实base image也可以自制, 参考docker提供的mkimage开头的脚本 :  https://github.com/docker/docker/tree/master/contrib 例如mkimage-yum.sh是在centos中制作centos base image的脚本. 例如我在CentOS 6.x x

hi3531的i2c部分

一.关于编译Hi3531 SDK: 之前编译SDK时编译到make uImage总出错,一是找不到.config文件,这个问题是必须先make menuconfig 然后保存.config文件. 二是编译到make uImage的快结束时,会出现找不到mkimage命令错误. 解决方法:     查看最底层的Makefile:arch/arm/boot/Makefile,可以看到:     quiet_cmd_uimage = UIMAGE  $@       cmd_uimage = $(CO

Davinci DM6446开发攻略——u-boot-1.3.4移植(1)

UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT是1.2.0版本,国内很多公司还一直使用u-boot-1.1.4和u-boot-1.1.6.其实,我们也没必要追风跟上最新版本,程序跑稳定才是最重要的.当然,有兴趣研究研究也不错,毕竟最新版本增加很多实用的功能.在移植之前,我们简单介绍u-boot这些版本架构的变化.从u-boot-1.3.0到u-boot-1.3.2基本上架构是一样的,而从u-boot-1.3.