这里会显示出您选择的修订版和当前版本之间的差别。
jaysnote:android_bootimg [2018/11/21 17:39] jaylee |
jaysnote:android_bootimg [2021/06/22 23:14] |
||
---|---|---|---|
行 1: | 行 1: | ||
- | < | ||
- | |||
- | # android boot image | ||
- | |||
- | 全志 a64 linux sdk采用了android 的boot image,这里顺着该sdk系统理解android的引导镜像。 | ||
- | |||
- | 如下`linux-3.10/ | ||
- | |||
- | ```bash | ||
- | # | ||
- | export MKBOOTIMG=${LICHEE_TOOLS_DIR}/ | ||
- | local BIMAGE=" | ||
- | local RAMDISK=" | ||
- | # | ||
- | ${MKBOOTIMG} --kernel ${BIMAGE} \ | ||
- | --ramdisk ${RAMDISK} \ | ||
- | --board ${CHIP} \ | ||
- | --base ${BASE} \ | ||
- | --kernel_offset ${KERNEL_OFFSET} \ | ||
- | --ramdisk_offset ${RAMDISK_OFFSET} \ | ||
- | -o output/ | ||
- | ``` | ||
- | |||
- | 对于如上 mkbootimg | ||
- | |||
- | ```c | ||
- | // | ||
- | if(write(fd, | ||
- | if(write_padding(fd, | ||
- | |||
- | if(write(fd, | ||
- | if(write_padding(fd, | ||
- | |||
- | if(write(fd, | ||
- | if(write_padding(fd, | ||
- | ``` | ||
- | |||
- | 整合传递参数后,mkbootimg | ||
- | |||
- | ```c | ||
- | //mkboot.h line.166 | ||
- | /* When the boot image header has a version of BOOT_HEADER_VERSION_ONE, | ||
- | * image is as follows: | ||
- | * | ||
- | * +-----------------+ | ||
- | * | boot header | ||
- | * +-----------------+ | ||
- | * | kernel | ||
- | * +-----------------+ | ||
- | * | ramdisk | ||
- | * +-----------------+ | ||
- | * | second stage | o pages | ||
- | * +-----------------+ | ||
- | * | recovery dtbo | p 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 | ||
- | * p = (recovery_dtbo_size + page_size - 1) / page_size | ||
- | * | ||
- | * 0. all entities are page_size aligned in flash | ||
- | * 1. kernel and ramdisk are required (size != 0) | ||
- | * 2. recovery_dtbo is required for recovery.img in non-A/B devices(recovery_dtbo_size != 0) | ||
- | * 3. second is optional (second_size == 0 -> no second) | ||
- | * 4. load each element (kernel, ramdisk, second) at | ||
- | | ||
- | * 5. If booting to recovery mode in a non-A/B device, extract recovery dtbo and | ||
- | | ||
- | | ||
- | * 6. prepare tags at tag_addr. | ||
- | | ||
- | * 7. r0 = 0, r1 = MACHINE_TYPE, | ||
- | * 8. if second_size != 0: jump to second_addr | ||
- | | ||
- | */ | ||
- | ``` | ||
- | |||
- | 这里需要深入理解metadata`boot_img_hdr_v1`, | ||
- | |||
- | ```c | ||
- | //bootimg.h line 121 | ||
- | struct boot_img_hdr_v1 { | ||
- | | ||
- | |||
- | | ||
- | | ||
- | |||
- | | ||
- | | ||
- | |||
- | | ||
- | | ||
- | |||
- | | ||
- | | ||
- | /* | ||
- | * version for the boot image header. | ||
- | * alternately this is used as dt_size on some hardware. | ||
- | */ | ||
- | union { | ||
- | | ||
- | | ||
- | }; | ||
- | |||
- | /* operating system version and security patch level; for | ||
- | * version " | ||
- | * ver = A << 14 | B << 7 | C (7 bits for each of A, B, C) | ||
- | * lvl = ((Y - 2000) & 127) << 4 | M (7 bits for Y, 4 bits for M) | ||
- | * os_version = ver << 11 | lvl */ | ||
- | | ||
- | |||
- | | ||
- | |||
- | | ||
- | |||
- | | ||
- | |||
- | /* Supplemental command line data; kept here to maintain | ||
- | * binary compatibility with older versions of mkbootimg */ | ||
- | | ||
- | |||
- | | ||
- | | ||
- | | ||
- | } __attribute__((packed)); | ||
- | ``` | ||
- | |||
- | 直接dump boot.img 验证如上首地址的metadata。 | ||
- | |||
- | ```bash | ||
- | jay@mxj-build: | ||
- | 00000000 | ||
- | 00000010 | ||
- | 00000020 | ||
- | 00000030 | ||
- | 00000040 | ||
- | * | ||
- | 00000064 | ||
- | ``` | ||
- | </ | ||