在 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,我相信)典型的字节顺序和对齐方式吗?即使引导加载程序本身从不将标头视为结构,但mkbootimg
在具有不同字节顺序/对齐方式(针对 Android ARM)的系统上运行似乎现在会出现问题。
我是否高估了结构布局的共同差异?