在最初学习阶段,我们经常使用mkimage来制作uImage和ramdisk,实质是在被处理的文件前面加上64字节的头部。在到后来,我们可以将多个内核+多个设备树文件+ramdisk打包成一个 linux.itb 文件,用于一个镜像文件支持多平台启动,同样是使用 mkimage 工具来制作,不难猜测,它也是将这多个文件按照一定的方式进行组合,然后再在文件的开头加上64字节的头部。

有时候难免悲剧发生,发现自己ramdisk.img的源码找不到了,又懒重新制作,但是又需要对镜像进行修改,无奈之下我们需要解包(或者你想窥探一下别人镜像里的秘密),如何解包是本文的重点,mkimage工具的使用方法,一带而过。

mkimage 制作 uImage

mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-3.0 -d zImage uImage

mkimage 制作 ramdisk.img

dd if=/dev/zero of=ramdisk.ext4 bs=1M count=0 seek=32
mkfs.ext4 -F -i 4096 ramdisk.ext4 -d ramdisk
gzip --best -c ramdisk.ext4 > ramdisk.ext4.gz
mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.ext4.gz ramdisk.img

mkimage 制作 itb 文件,它使用一个its文件来描述itb内部构造

mkimage -f linux_arm32.its linux.itb

制作好linux.itb文件之后,在uboot阶段将其加载到内存中,使用bootm命令进行启动,例如:

bootm 0x4a000000#ls1012afrwy;

its 文件示例如下:

/dts-v1/;/ {description = "Image file for the QorIQ ARM 32b Linux Kernel";#address-cells = <1>;images {kernel-v7 {description = "ARM32 Linux kernel";data = /incbin/("../../build/linux/kernel/arm32/zImage.v7");type = "kernel";arch = "arm";os = "linux";compression = "none";load = <0x80008000>;entry = <0x80008000>;};kernel-v8 {description = "ARM32 Linux kernel";data = /incbin/("../../build/linux/kernel/arm32/zImage.v8");type = "kernel";arch = "arm";os = "linux";compression = "none";load = <0x80008000>;entry = <0x80008000>;};initrd {description = "initrd for arm32";data = /incbin/("../../packages/rfs/ramdiskrfs/ramdisk_rootfs_arm32.ext4.gz");type = "ramdisk";arch = "arm";os = "linux";compression = "none";};ls1021atwr-dtb {description = "Flattened Device Tree blob";data = /incbin/("../../build/linux/kernel/arm32/ls1021a-twr.dtb");type = "flat_dt";arch = "arm";compression = "none";load = <0x90000000>;};ls1043ardb-dtb {description = "Flattened Device Tree blob";data = /incbin/("../../build/linux/kernel/arm32/fsl-ls1043a-rdb-sdk.dtb");type = "flat_dt";arch = "arm";compression = "none";load = <0x9ffe0000>;};};configurations {ls1021atwr {description = "Boot Linux kernel";kernel = "kernel-v7";fdt = "ls1021atwr-dtb";ramdisk = "initrd";};ls1043ardb {description = "Boot Linux kernel";kernel = "kernel-v8";fdt = "ls1043ardb-dtb";ramdisk = "initrd";};};
};

本文重点mkimage 解包
uImage ramdisk.img 只需要除去64字节头部,即可得到原始文件。
例如:dd if=ramdisk.img of=ramdisk.img.gz skip=64 bs=1
对于itb文件,由于它是多个文件,因此我们只去除头部是不够的,还需要进一步处理,不过呢,我们可以借助uboot中一个另外一个工具:dumpimage (2015之后的版本才有,位于tools目录)

Usage: /tmp/dumpimage -l image-l ==> list image header information/tmp/dumpimage -i image -T type [-p position] [-o outfile] data_file-i ==> extract from the 'image' a specific 'data_file'-T ==> set image type to 'type'-p ==> 'position' (starting at 0) of the 'data_file' inside the 'image'/tmp/dumpimage -V ==> print version information and exit

-T 这里始终指定为 flat_dt 即可。
-p 指的是its文件中的images索引,例如 kernel-v7 为0,kernel-v8 为1

例如,想解压出linux.itb中的 kernel-v7

dumpimage -i ./linux.itb -T flat_dt -p 0 zImage.v7

mkimage使用与解包相关推荐

  1. OpenWRT 学习笔记-17 OpenWRT固件的结构分析,逆向解包

    固件是由三部分组成:固件头.kernel.rootfs.我们可以通过mkimage工具分析固件头,用binwalk来解包固件分析kernel和rootfs,通常rootfs一般是squashfs格式的 ...

  2. [Python]网络打解包

    Python与C.C++交互的时候,如果进行网络消息的收发,需要讲数据打包解包为字节流. 这时候就会用到Struct模块中的pack.unpack函数 打包: PKG = ''# '!' means ...

  3. 【Python】序列解包 and * 和 ** 的区别

    可以使用序列解包功能对多个变量进行赋值. 序列解包也可以用于列表和字典,但对字典使用时,默认是对字典的"键"进行操作: 如果需要对"键:值"进行操作,需要使用字 ...

  4. 关于学习Python的一点学习总结(18->序列解包)

    46.序列解包;将一个序列(或任何可迭代对象)解包,并将得到的值存储到一系列变量中. >>> x,y,z=6,8,9>>> print(x,y,z)6 8 9> ...

  5. linux把文件复制到压缩包里,Linux学习笔记(二十)文件压缩 zip压缩、tar打包、打包、解包...

    一.zip压缩 首先安装zip与unzip yum install -y zip/unzip zip 1.txt.zip 1.txt 压缩文件1.txt,压缩文件名称为1.txt.zip zip -r ...

  6. Python * ** 打包解包详解

    里边出现的英文都来自于python官网的开发者指南 本文主要就是介绍*和**对此展开详细介绍. Unpacking is proposed to be allowed inside tuple, li ...

  7. 指针的本质是:内存(地址)+ 类型 装包解包

    指针的本质是:内存(地址)+ 类型 指针只是将变量对应的内存装包: *P是解包的操作.

  8. 强制解包看 Swift 的设计

    不知道大家有没有发现,在一个 Objective-C 和 Swift 混编的 App 中,当把一个 OC 中的参数转到 Swift 时,Swift 会自动把这个变量进行强制解包.举个例子,我在 OC ...

  9. python正确的赋值语句-Python 赋值语句技巧之序列解包

    python赋值语句技巧之序列解包sequence unpacking,是python语言赋值语句的一种技巧方法,在给多个python 变量命名同时赋值时是很有效率的一种方法. 赋值语句序列解包概念 ...

最新文章

  1. python如何获取版本信息判断当前的python版本
  2. css背景图宽度只适应,高度不变
  3. 阿里面试“神器”,成为众多程序员手中的王炸!
  4. axis1.4 wsdl2java_axis2(1.4及以上版本) wsdl2java 使用方式 | 学步园
  5. zabbix 获取不到自定义脚本的值解决
  6. 2018-12-26 课堂笔记 for循环
  7. [swift 进阶]读书笔记-第八章:错误处理 C8P3 带有类型的错误
  8. 图像处理ORL--训练集及测试集建立--Matlab实现
  9. java.util.Scanner包的使用
  10. PPT修行之路(一)
  11. 【Servlet入门】一篇文章让你从没听过到了熟于心
  12. 最大化参数 火车头_火车采集器,您身边的的网页数据采集专家!
  13. 马一篇知乎大佬的诠释
  14. 二级域名泛解析,让iis支持二级域名泛解析
  15. 多表联查--01---LEFT JOIN 实现多表联查
  16. android p 荣耀v10,荣耀V10和V9哪个好 区别对比分析告诉你
  17. 小Q系列故事——为什么时光不能倒流
  18. 计算机一级考试:选择题汇总E(精简版)
  19. 12.8 Daily Scrum
  20. FL Studio 21官方中文版如何终身免费升级及如何插入第三方插件

热门文章

  1. 哈工大刘宏伟《计算机组成原理》课程框架总结
  2. 一键部署LNMP服务
  3. 华清远见重庆中心—JavaWeb技术总结/个人总结
  4. TensorFlow入门教程:1:安装和第一个例子程序
  5. 社区 计算机技能 培训,湛江妇女网 - 计算机技能培训进黄外社区
  6. 如何快速的学习任何一门编程语言
  7. 铁打的星巴克,流水的新饮品
  8. SpringMVC4.x源码分析(七):使用XStream处理xml请求和响应消息实战
  9. CSS快速记忆笔记(三)
  10. java 全站静态化_java如何页面全站静态化