在Android系统上,内核,ramdisk和一些元数据存储在由引导加载程序处理的二进制磁盘映像中。图像是使用mkbootimg
实用程序构建的。
检查mkbootimg
来源,我发现图片格式的标题定义为
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];
unsigned id[8]; /* timestamp / checksum / sha1 / etc */
};
没有任何进一步的资格。这个结构的一个实例是在write
的图像文件的开头写的。
这是不是在启动映像中嵌入了主机系统典型的字节顺序和对齐方式(x86,我相信)?即使引导加载程序本身从不将标头视为结构,似乎在具有不同字节顺序/对齐(对于Android ARM)的系统上运行mkbootimg
现在也会出现问题。
我是否过高估计了结构布局的常见差异?