参考文件:system/core/libmincrypt/sha.c
system/core/mkbootimg/mkbootimg.c
首先,一般bootimage 的结构如下
(1 page 有可能是2048或4096,具体看flash的类型)
** +-----------------+
** | boot header | 1 page
** +-----------------+
** | kernel | n pages
** +-----------------+
** | ramdisk | m pages
** +-----------------+
ramdisk,很多配置文件放在此处,且不能修改
下载的时候什么样子,以后就是什么样子
打包的时候会计算kernel,ramdisk分区数据的sha值,并把其存放在boot header
(注意:计算的时候不包含boot header本身)
SHA_init(&ctx); SHA_update(&ctx, kernel_data, hdr.kernel_size); SHA_update(&ctx, &hdr.kernel_size, sizeof(hdr.kernel_size)); SHA_update(&ctx, ramdisk_data, hdr.ramdisk_size); SHA_update(&ctx, &hdr.ramdisk_size, sizeof(hdr.ramdisk_size)); SHA_update(&ctx, second_data, hdr.second_size); SHA_update(&ctx, &hdr.second_size, sizeof(hdr.second_size)); sha = SHA_final(&ctx); memcpy(hdr.id, sha, SHA_DIGEST_SIZE > sizeof(hdr.id) ? sizeof(hdr.id) : SHA_DIGEST_SIZE);
当然不同的厂家,为了安全是可以修改如下的字符串:
void SHA_init(SHA_CTX* ctx) { ctx->state[0] = 0x67452301; ctx->state[1] = 0xEFCDAB89; ctx->state[2] = 0x98BADCFE; ctx->state[3] = 0x10325476; ctx->state[4] = 0xC3D2E1F0; ctx->count = 0; }
当从prelaoder 或者 uboot等加载kernel的时候,就会去重新计算sha值,
从而保证bootimage,被别人因为某些目的而直接修改bin文件。(如根文件系统的某些配置或属性文件)