日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

boot.img详解

發(fā)布時間:2025/3/21 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boot.img详解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、cmdline打包的過程

1、INTERNAL_KERNEL_CMDLINE是一串字符串,由BOARD_KERNEL_CMDLINE變量,再拼接buildvariant+$(VERITY_KEYID)而成。
其中,BOARD_KERNEL_CMDLINE變量在device/asr/aquilac_phone/BoardConfig中定義
vim build/core/Makefile

INTERNAL_KERNEL_CMDLINE := $(strip $(BOARD_KERNEL_CMDLINE) buildvariant=$(TARGET_BUILD_VARIANT) $(VERITY_KEYID))

INTERNAL_KERNEL_CMDLINE加入到INTERNAL_BOOTIMAGE_ARGS中:

INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"

2、然后使用mkbootimg工具,打包制作了boot.img

$(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(INTERNAL_MKBOOTIMG_VERSION_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET)

其中:
(1)、MKBOOTIMG是mkbootimg,是android的制作boot.img的工具
(2)、INTERNAL_BOOTIMAGE_ARGS,是制作boot.img所需的參數(shù),這里包含ramdisk、cmdline等

/* the boot image, which is a collection of other images. */ INTERNAL_BOOTIMAGE_ARGS := \$(addprefix --second ,$(INSTALLED_2NDBOOTLOADER_TARGET)) \--kernel $(INSTALLED_KERNEL_TARGET) INTERNAL_BOOTIMAGE_ARGS += --ramdisk $(INSTALLED_RAMDISK_TARGET) INTERNAL_BOOTIMAGE_ARGS += --base $(BOARD_KERNEL_BASE) INTERNAL_BOOTIMAGE_ARGS += --cmdline "$(INTERNAL_KERNEL_CMDLINE)"

(3)、BOARD_MKBOOTIMG_ARGS是boot.img的header_version版本號,在android9.0上,強制要求boot.img,recovery.img的header_version為1,否則vts測不過.

vim device/asr/aquilac_phone/BoardConfig.mk

/* The header_version of boot.img and recovery.img must be 1 */ BOARD_BOOTIMG_HEADER_VERSION:=1 BOARD_MKBOOTIMG_ARGS:=--header_version $(BOARD_BOOTIMG_HEADER_VERSION)

(4)、INTERNAL_MKBOOTIMG_VERSION_ARGS目前沒做要求,為空

二、boot.img格式
以下為boot.img的header格式,在kernel/uboot/include/android_image.h中可以查看到.
其中,kernel_addr、ramdisk_addr、second_addr、均表示該鏡像在boot.img中的位置

#define ANDR_BOOT_MAGIC "ANDROID!" #define ANDR_BOOT_MAGIC_SIZE 8 #define ANDR_BOOT_NAME_SIZE 16 #define ANDR_BOOT_ARGS_SIZE 512 struct andr_img_hdr {char magic[ANDR_BOOT_MAGIC_SIZE];u32 kernel_size; /* size in bytes */u32 kernel_addr; /* physical load addr */u32 ramdisk_size; /* size in bytes */u32 ramdisk_addr; /* physical load addr */u32 second_size; /* size in bytes */u32 second_addr; /* physical load addr */u32 tags_addr; /* physical addr for kernel tags */u32 page_size; /* flash page size we assume */u32 unused[2]; /* future expansion: should be 0 */char name[ANDR_BOOT_NAME_SIZE]; /* asciiz product name */char cmdline[ANDR_BOOT_ARGS_SIZE];u32 id[8]; /* timestamp / checksum / sha1 / etc */ };

那么kernel(ZImage或Image)在哪個位置呢?
其實android要求,boot.img的offset=0x800處,存放kernel. 由下列的宏定義也可以看出

/* Kernel loader address is where the kernel binary to be loaded. Before that, we have */ /* Android header (0x800 long) and AIMG header (0x20 long). Be aware to adjust these */ /* offsets when the header size is changed. */ #define CONFIG_ASR_BOOT 1 #define BOOTIMG_HEAD_SIZE 0x800 #define AIMG_HEAD_SIZE 0x20 #define AIMG_TAIL_SIZE 0x100 #define SIGNED_BOOTIMG_LOADADDR (KERNEL_LOADADDR - BOOTIMG_HEAD_SIZE - AIMG_HEAD_SIZE) #define BOOTIMG_LOADADDR (KERNEL_LOADADDR - BOOTIMG_HEAD_SIZE)

總結(jié)

以上是生活随笔為你收集整理的boot.img详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。