boot.img文件结构实例解析
linux的几个内核镜像格式Image和u-boot启动内核和文件系统时的一些环境变量的设置

linux的几个内核镜像格式Image和u-boot启动内核和文件系统时的一些环境变量的设置关于编译powerpc linux的几个Image参考原文 /s/blog_86a30b0c0100wfzt.html转载▼PowerPC架构 Linux和ARM,X86等平台有些差异,PowerPC平台HW参数不是通过命令行方式传递到Linux,而是通过传递Device tree文件的方式传递参数,所以PowerPC平台Linux需要编译dtb和uImage才能正常加载,另外PowerPC架构linux还提供simpleImage的方式加载,也就是将dtb与uImage或将dtb,uImage 与ramdisk.image.gz多个文件整合生产单个simpleImage文件,这种simpleImage文件加载方式适合于没有bootloader支持的情况下,通过JTAG将simpleImage直接加载到target board内存中运行,对于调试非常方便,下面说说这几种Image文件的编译:1,dtb:dtb文件由dts生成,对于任何一个PowerPC处理器板,都要有对应的dts文件,dts文件主要是对目标板的HW参数进行描述,比如我的目标板是evm440(Powerpc440),我编写了一个evm440.dts文件放到内核arch/powerpc/boot/dts/目录下.编译evm440.dtb文件命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- evm440.dtb编译成功后会在arch/powerpc/boot/下生成evm440.dtb文件,这就是我们需要的dtb文件.2. uImage:这个Image应该是地球都知道的,这里就不多说了,编译命令如下:$ make ARCH=powerpc CROSS_COMPILE=/toolchain/freescale-2010.09/bin/powerpc-linux-gnu- uImage编译成功后会在arch/powerpc/boot/下生成uImage文件,这就是我们需要的内核Image文件.3. simpleImage.xxxx和simpleImage.initrd.xxxx:这里的xxxx是特定目标板名字,我的目标板是evm440,也就是simpleImage.evm440和simpleImage.initrd.evm440。
如何解包/编辑/打包boot.img文件

目录1、背景知识2、boot和recovery映像的文件结构3、对映像文件进行解包、编辑、打包的常规方法3.1、另一种解包、编辑、打包的方法4、将新的映像刷回到手机5、解包、编辑、打包为我们带来了什么6、本文讲的内容与使用update.zip刷机包不是一码事正文1、背景知识Android手机的文件系统有许多存储器组成,以下是在adb shell下面的输出:#cat /proc/mtddev: size erasesize namemtd0: 00040000 00020000 "misc"mtd1: 00500000 00020000 "recovery"mtd2: 00280000 00020000 "boot"mtd3: 04380000 00020000 "system"mtd4: 04380000 00020000 "cache"mtd5: 04ac0000 00020000 "userdata"注意,不同的手机在上述存储设备的顺序可能会各不相同!一定要检查您的手机,确定在以下的操作中选择正确的设备号(mtdX,这个X的序号一定要检查清楚)。
在本向导中,我们主要描述对"recovery"和"boot"的存储设备进行操作;"system"存储设备保存了android系统目录的所有数据(在系统启动后会挂载到“system/”目录);“userdata”存储设备将保存了android数据目录中的所有数据(在系统启动后会挂载到“data/”目录,里面是会有很多应用数据以及用户的preference之类的配置数据)。
从上面的输出可以看出来,recovery和boot分区对应着/dev/mtd/mtd1和/dev/mtd/mtd2,在你您开始做任何修改之前一定要做两件事情,第一件事情,一定要先对这两个分区进行备份。
android主要镜像(image)解析

android主要镜像(image)解析img解析:ramdisk.img:android根文件系统,在android编译系统生成的out/target/product/root目录中结构:./init.trout.rc./default.prop 保存一些调试参数,对于开发者相当重要./proc./dev./init.rc 一些启动参数./init./sys./init.goldfish.rc./sbin./sbin/adbd./system system.img挂载点./data userdata.img挂载点userdata.img 保存用户、应用信息。
结构:/data/app 所有安装后的app会移至此处,apk被拆成dex和apk,dex为目标文件,apk为资源包/data/data 应用程序内部存储信息,sharepreference、database,etcsystem.img 包含整个android系统结构:system/app android出厂内置应用在此,同时,在这里的app可以获得一些特别的权限。
system/framework android框架在此,不宜乱动,开发者可以使用adb push + 拔电池开关机可以快速验证问题。
(前提是eng 版本)Special App:SystemUI.apk 状态栏藏在里面。
framework-res.apk包含整个系统res文件夹 including 系统UI、一些配置参数、theme、style、animationrecovery.img 按power键+音量上键(android默认)可以进去,可以执行T卡升级,format,backup userdata,restore userdata 结构:不知道boot.img 包含一个linux kernel (maybe named as zImage)和一个ramdisk。
img文件结构在源码system/core/mkbootimg/bootimg.h中声明uboot.img android启动时第一个加载的镜像,初始化硬件和基本输入出系统。
bootimg的详细介绍&使用实例

文件系 /挂载点/
统
大小
描述
BOOT: /dev/mtdblock[?]
/
(RAM)
Raw
内核、内存盘和引导配置。
DATA:
/dev/mtdblock5
/data/ yaffs2
91904kb
用户、系统配置,软件配 置以及软件(没有 a2sd 的
话)
CACHE:
/dev/mtdblock4
/cache/ yaffs2
*/
boot 的 ramdisk 映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文
件,例如:初始化 init 进程以及 init.rc(可以用于设置很多系统的参数)等文件。
以下是一个典型的 ramdisk 中包含的文件目录列表:
│ default.prop
│ init
│ init.goldfish.rc
** appended to the kernel commandline in the tags.
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr
** 6. if second_size != 0: jump to second_addr
** else: jump to kernel_addr
│ default.prop
│ init
│ init.rc
│ initlogo.rle
//开机第二屏图片
│ ueventd.goldfish.rc
│ ueventd.rc
│ ueventd.swift.rc
│
├─data
├─dev
├─etc
│ recovery.fstab
华为荣耀B876版ROOT成功 附BOOT文件及原始BOOT文件

华为荣耀B876版ROOT成功附BOOT文件及原始BOOT文件温馨提醒:刷机有风险root需谨慎今天在论坛上按照上面的方法成功root了,下面是原帖的地址---/thread-14272558-1-497-1.html第一次用安卓手机.今天root成功后把里面自带的程序用RE管理器给删了一部分,qq没有删(有人反映说删掉qq后系统不稳定所以不敢删),现在一切正常.下面是我重新上传的BOOT 文件,已经制作成了2个压缩包了,方便下载boot.part1.rar (2.86 MB)boot.part2.rar (1.57 MB)(2个压缩包要一起下载,放在同一个文件夹里面解压其中的一个就可以了)下面附上原作者的方法;1.下载并解压root文件。
2.音量加+音量减+开机键进入粉屏。
在这之前请不要勾选快去“快速启动”,否则无法进入粉屏,设置--应用程序--快速启动,把√去掉即可。
如果刚刷过机,请删除SD卡中的“dload”文件夹。
3.用数据线连接电脑。
电脑中会出现一个可移动磁盘。
把解压出来的文件“boot.img”复制到可移动磁盘中image 文件夹,替换原有的boot.img文件。
4.拔电池,重启。
5.OK了。
启动手机后手机里面多了一个授权管理就说明ROOT成功了,可以使用RE管理器删除自带的程序了,打开RE,找到system文件夹然后再找到app文件夹,左上角挂载为读写就可以删除程序了手机上那些烦人的下拉菜单中的软件广告再也没有了,呵呵另外再送上我备份的手机系统自带的原始BOOTB876版的boot.part1.rar (2.86 MB)boot.part2.rar (1.15 MB)。
刷机失败问题解析

======== (command write failed (Invalid argument)) / 8672 ======== 翻译:命令写入失败(无效参数)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)(手机助手冲突)======== (command write failed (No such device or address)) / 26709 ========翻译:命令写入失败(没有这样的设备或地址)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (No such file or directory)) / 893 ========翻译:命令写入失败(没有这样的文件或目录)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Too many links)) / 1771 ========翻译:(命令写入失败(太多的链接)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Too many open files in system)) / 4 ========翻译:命令写入失败(系统中打开文件过多)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (command write failed (Unknown error)) / 1407 ========翻译:(命令写入失败(未知错误)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (No such device or address)) / 302 ========翻译:数据传输失败(没有这样的设备或地址)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (No such file or directory)) / 17 ========翻译:数据传输失败(没有这样的文件或目录)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (Too many links)) / 5141 ========翻译:数据传输失败(太多的链接)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (data transfer failure (Unknown error)) / 1927 ========翻译:数据传输失败(未知错误)PS:数据线或USB口问题(链接中断,链接不稳定,供电不足)======== (remote failure) / 14 ========翻译:(远程故障)PS:在刷机途中插入了另外一部手机。
android img 的编译过程

android img 的编译过程
Android img的编译过程通常包括以下步骤:
在Android源码根目录下执行初始化环境命令:source build/envsetup.sh。
使用lunch命令选择需要编译的版本,如:lunch full-eng。
执行make命令进行编译,如:make bootimage,这个命令会编译生成boot.img。
boot.img的生成过程主要是将kernel、ramdisk、dtb打包到一起。
在这个过程中,需要用到dtb.img,如果dtb.img过大导致编译不过,那么需要分析dtb.img的生成过程。
dtb.img实际上是将kernel下的dts文件重新命名后拷贝到out目录下生成的。
此外,编译Android系统时,make命令实际上是在执行Makefile文件。
Android系统的Makefile文件在源码根目录下,并且这个Makefile文件会包含另一个主要的Makefile文件,即main.mk。
在main.mk中,定义了一个默认目标droid,这个目标依赖于droid_targets。
droid_targets又依赖于droidcode和dist_files两大伪目标。
当执行make命令时,make工具会检查并解析这些依赖关系,然后按照依赖顺序生成目标文件。
BOOT的简单移植教程

基于论坛蛙友的要求,所以今天跟大家探讨一下BOOT的简单移植。
今天咱只说说简单的移植,不说美化!!~好了,具体操作如下:移植准备:1:官方BOOT.IMG2:乐蛙包里的BOOT或者其他机型里面的BOOT。
(尽量找跟自己的手机按键位置相同的)3:移植软件:BOOTIMG.EXE移植方向:用官方kernel??内核文件,用乐蛙包里的RAMDISK文件,然后打包。
就OK了,移植步骤:本帖隐藏的内容1:首先将官方BOOT放到BOOTIMG的工作文件夹一面。
然后运行CMD,然后用CD命令进入到你的BOOTIMG的工作文件夹下面,然后输入BOOTIMG.EXE如果出现帮助了就OK了。
2:在CMD里面运行命令:bootimg --unpack-bootimg,在BOOTIMG文件夹下面就产生了??kernel??内核文件??和??ramdisk??磁盘镜像文件??这两个文件是解压BOOT.IMG产生的。
此时不要关闭CMD窗口,在CMD右键选择标记,将你键入bootimg --unpack-bootimg这个命令,产生的信息复制下来,最好是粘贴到文本里面。
因为等一下打包要用这些信息。
然后复制刚刚生成出来的??kernel??内核文件? ? 复制到别出,等一下还要用。
然后删除BOOTIMG工作文件夹下的kernel 和ramdisk??和官方的BOOT.IMG文件3:将乐蛙的BOOT.ING复制到BOOTIMG的工作文夹件执行第二步的解压命令,也会产生kernel??内核文件??和??ramdisk??磁盘镜像文件,这时候我们删除kernel??内核文件,然后把刚刚复制到别处的官方的??kernel??再复制到这里来。
并删除乐蛙的BOOT.IMG4:把ramdisk重命名为ramdisk.gz? ?在CMD里面运行打包命令。
bootimg --repack-bootimg?0x200000?console="ttyMSM1 androidboot.hardware=qcom"4096 4096把红色部分改成刚刚你解压官方的BOOT.IMG的时候叫人复制到文本里面的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PLATFORM := msm7k MEMBASE := 0x00000000 # SMI MEMSIZE := 0x00800000 # 8MB BASE_ADDR := 0x10000000
TAGS_ADDR := BASE_ADDR+0x00000100 KERNEL_ADDR := BASE_ADDR+0x00800000 RAMDISK_ADDR := BASE_ADDR+0x01000000 SCRATCH_ADDR := BASE_ADDR+0x02000000
header 补齐page_size大小,kernel 从0x800开始,实际内容结束位置0x315778+0x800=0x315F78, 结 束于(1+n)*page_size -1= 0x316000 - 1 经过512byte(0x200)的信息头。Kernel内容开头标志重复8遍的0000A0E1。Kernel实际大小结束后0填充, 即padding剩余页空间。 (512byte信息头是由mkimage工具里面决定的。稍后介绍其结构。)
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr ** 6. if second_size != 0: jump to second_addr ** else: jump to kernel_addr */
boot header 为包括命令行参数等等,地址为 000-----0xFFF ramdisk 为 1F8B0800000000 开头 kernel 为 0000A0E1 重复 8 遍开头
根据上面的命令我们可以首先看看 mkbootimg 这个工具的源文件:system/core/mkbootimg /mkbootimg.c。看完之后我们就能很清晰地看到 boot.img 的内部构造,它是由 boot header /kernel /ramdisk /second stage 构成的,其中前 3 项是必须的,最后一项是可选的。mkbootimg 分析参数后,依 次写入 header, kernel ,ramdisk . header + padding + kernel + padding + ramdisk + padding + ... 4 * 2, magic,固定为"ANDROID!" 4 * 1, kernel 长度,小端 unsigned
out/host/linux-x86/bin/mkbootimg --kernel out/target/product/msm7630_surf/kernel --ramdisk out/target/product/msm7630_surf/ramdisk.img --cmdline "console=ttyMSM1,115200n8 androidboot.hardware=qcom" --base 0x00200000 --pagesize 4096 --output out/target/product/msm7630_surf/boot.img
/* ** ++ ** | boot header | 1 page ** ++ ** | kernel | n pages ** ++ ** | ramdisk | m pages ** ++ ** | second stage | o pages ** ++ ** ** n = (kernel_size + page_size 1) / page_size ** m = (ramdisk_size + page_size 1) / page_size ** o = (second_size + page_size 1) / page_size ** ** 0. all entities are page_size aligned in flash ** 1. kernel and ramdisk are required (size != 0) ** 2. second is optional (second_size == 0 > no second) ** 3. load each element (kernel, ramdisk, second) at ** the specified physical address (kernel_addr, etc) ** 4. prepare tags at tag_addr. kernel_args[] is ** appended to the kernel commandline in the tags.
由此可知 boot_img_hdr 中各成员值为:
magic[BOOT_MAGIC_SIZE] = "ANDROID!" kernel_size kernel_addr ramdisk_size = = = 0x00315778 0x10008000
0x000CAF13 0x11000000 0x00000000 0x10f00000 0x10000100 0x00000800
#define BOOT_MAGIC "ANDROID!" #define BOOT_MAGIC_SIZE 8 #define BOOT_NAME_SIZE 16 #define BOOT_ARGS_SIZE 512 struct boot_img_hdr { unsigned char magic[BOOT_MAGIC_SIZE]; unsigned kernel_size; /* size in bytes */ unsigned kernel_addr; /* physical load addr */ unsigned ramdisk_size; /* size in bytes */ unsigned ramdisk_addr; /* physical load addr */ unsigned second_size; /* size in bytes */ unsigned second_addr; /* physical load addr */ unsigned tags_addr; /* physical addr for kernel tags */ unsigned page_size; /* flash page size we assume */ unsigned unused[2]; /* future expansion: should be 0 */ unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ unsigned char cmdline[BOOT_ARGS_SIZE]; }; id[8]; /* timestamp / checksum / sha1 / etc */
接下来就是我们自己加在后面的 Magic formware 签名格式了。开始于 0x3E1000,Magic offset 为 4
kernel+ramdisk img 结构
cust_part.h
typedef union { struct { unsigned int magic; /* partition magic */ unsigned int dsize; /* partition data size */ char name[32]; /* partition name */ unsigned int maddr; /* partition memory address */ } info; unsigned char data[512]; } part_hdr_t;
经过分析:boot.img 与 recoveryimg、factoryimg 共用相同的结构,他们之间不同在于 Ramdisk 的内容, 线索在 load_image.c 中 check img info 使用相同结构体声明各个 img。 boot 镜像不是普通意义上的文件系统,而是一种特殊的 Android 定制格式,由文件头信息 boot header, 压缩的内核,文件系统数据 ramdisk 以及 second stage loader(可选)组成,它们之间非页面对齐部分 用 0 填充,可以从 mkbootimg.h 文件中看到。 文件头信息的具体结构可以在 system/core/mkbootimg/bootimg.h 中看到:
ramdisk 映像是一个最基础的小型文件系统,它包括了初始化系统所需要的全部核心文件,例如:初始化 init 进程以及 init.rc(可以用于设置很多系统的参数)等文件。以下是一个典型的 ramdisk 中包含的文件 列表: ./init.trout.rc ./default.prop ./proc ./dev ./init.rc ./init ./sys ./init.goldfish.rc ./sbin ./sbin/adbd ./system ./data
ramdisk接着kernel开始于0x316000,实际内容结束位置0xCAF13+0x316000=0x3E0F13,结束于 (1+n+m)*page_size -1= 0x3E1000 – 1 经过512byte的信息头。Ramdisk内容开头标志1F8B0800000000。Ramdisk实际大小结束后0填充,即 padding剩余页空间。
4 * 1, kernel 地址,应为 base + 0x00008000 (base 根据对应平台的 rules.mk 指定) 4 * 1, ramdisk 长度,小端 unsigned 4 * 1, ramdisk 地址,应为 base + 0x01000000 4 * 1, second stage 长度,小端 unsigned,为 0 4 * 1, second stage 地址,应为 base + 0x00f00000 4 * 1, tags 地址,应为 base + 0x00000100 4 * 1, page 大小,小端 unsigned, 为 2048 或者 4096 4 * 2, 未使用,固定为 0x00 4 * 4, 板子名字,一般为空 4 * 128, 内核命令参数 4 * 8, id, 为 sha 之类,实际写 0x00 就可 padding, 以上 header 为 608 字节,把这部分补齐到 page_size 大小 kernel_size, kernel 内容 padding,把 kernel_size 补齐到 page_size ramdisk_size, ramdisk 内容 padding, 把 ramdisk 补齐到 page_size second_size, second 内容,一般为 0 padding, 补齐 second_sise 为 page_size,一般为 0 配合 boot.img 来看会比较好理解.