android10分区镜像,分区和映像 | Android 开源项目 | Android Open Source Project
分區
Android 設備包含若干個分區,這些分區在啟動過程中發揮不同的作用。為了支持 A/B 更新,設備需要為 boot、system、vendor 和 radio 分區分別單獨配置一個槽位。
boot:boot 分區包含通過 mkbootimg 組合在一起的內核映像和 RAM 磁盤。為了直接刷寫內核而不刷寫新的 boot 分區,可以使用虛擬分區:kernel:kernel 虛擬分區僅覆蓋內核(zImage、zImage-dtb、Image.gz-dtb),方法是寫入新的映像來覆蓋舊的映像。為此,它會確定 eMMC 中現有內核映像的起始位置并將新內核映像復制到該位置。請記住,新內核映像可能會大于現有內核映像。引導加載程序可以通過移動其后的任何數據來騰出空間或放棄出錯的操作。如果提供的開發內核不兼容,則可能需要使用相關的內核模塊更新 dtb 分區(如果存在)、vendor 分區或 system 分區。
ramdisk:ramdisk 虛擬分區通過將新映像寫入舊磁盤來僅覆蓋 RAM 磁盤。為此,它會確定 eMMC 中現有 ramdisk.img 的起始位置并將新 RAM 磁盤映像復制到該位置。請記住,新 RAM 磁盤映像可能會大于現有 RAM 磁盤映像。引導加載程序可以通過移動其后的任何數據來騰出空間或放棄出錯的操作。
system:system 分區主要包含 Android 框架。
recovery:recovery 分區用于存儲在 OTA 過程中啟動的恢復映像。如果設備支持 A/B 更新,則恢復映像可以是啟動映像中包含的 RAM 磁盤,而不是單獨的映像。
cache:cache 分區用于存儲臨時數據,如果設備使用 A/B 更新,則可以不要此分區。cache 分區不需要可從引導加載程序寫入,而只需要可清空。大小取決于設備類型和 userdata 分區的可用空間。目前,50MB 至 100MB 應該沒問題。
misc:misc 分區供恢復映像使用,存儲空間不能小于 4KB。
userdata:userdata 分區包含用戶安裝的應用和數據,包括自定義數據。
metadata:如果設備被加密,則需要使用 metadata 分區,該分區的存儲空間不能小于 16MB。
vendor:vendor 分區包含所有不可分發給 Android 開源項目 (AOSP) 的二進制文件。如果沒有專有信息,則可以省略此分區。
radio:radio 分區包含無線裝置映像。只有包含無線裝置且在專用分區中包含無線裝置專用軟件的設備才需要此分區。
tos:tos 分區用于存儲 Trusty 操作系統的二進制映像文件,僅在設備包含 Trusty 時使用。
流程
引導加載程序的運作方式如下:首先加載引導加載程序。
引導加載程序初始化內存。
如果使用 A/B 更新,則確定要啟動的當前槽位。
確定是否應按照支持更新中所述改為啟動恢復模式。
引導加載程序加載映像,其中包含內核和 RAM 磁盤(在 Treble 中,包含更多部分)。
引導加載程序開始將內核作為可自行執行的壓縮二進制文件加載到內存中。
內核將自身解壓縮并開始執行到內存中。
自此,舊版設備從 RAM 磁盤加載 init,而新版設備從 /system 分區加載它。
init 從 /system 分區中啟動并開始裝載其他所有分區,如 /vendor、/oem 和 /odm,然后開始執行代碼以啟動設備
映像
引導加載程序依賴于下面這些映像。
內核映像
內核映像以標準 Linux 格式創建,如 zImage、Image 或 Image.gz。內核映像可以單獨刷寫,也可以與 RAM 磁盤映像相結合,可以刷寫到 boot 分區,也可以從內存啟動。在創建內核映像時,建議使用連接的設備樹二進制文件,而不是為設備樹使用一個單獨的分區。為不同的電路板修訂版本使用多個設備樹 Blob (DTB) 時,應按電路板修訂版本降序連接多個 DTB。
RAM 磁盤映像
RAM 磁盤應包含適合作為 rootfs 裝載的根文件系統。RAM 磁盤映像先通過 mkbootfs 與內核映像組合在一起,然后再刷寫到 boot 分區中。
啟動映像
啟動映像應包含通過未經修改的 mkbootimg 組合在一起的內核和 RAM 磁盤。
您可以在以下位置找到 mkbootimg 實現:
引導加載程序會讀取由 mkbootimg 生成的
文件系統映像(系統、用戶數據和恢復映像)
YAFFS2 映像格式
如果使用原始 NAND 存儲空間,則這些映像必須是由未經修改的 mkyaffs2image 生成的 YAFFS2(可以在 Android 開源項目 (AOSP) 的 external/yaffs2/yaffs2/utils 中找到)。它們采用以下格式:| 2k bytes of data| yaffs extra data | padding | | 0 2048 | 0 64 | variable|
引導加載程序負責使用這些映像,并將 YAFFS 額外數據轉移到給定 NAND 硬件的帶外區域中的適當位置。如果需要軟件 ECC,則引導加載程序還應在此時執行相應的計算。
稀疏映像格式
如果使用基于塊的存儲設備,則應支持 ext4 或 f2fs。要快速傳輸并刷寫大型空 ext4 文件系統 (userdata),應以稀疏格式存儲映像,映像中包含有關文件系統的哪些區域可以保留不寫的信息。文件格式由 mke2fs 實用程序編寫,該實用程序還用于創建文件格式由引導加載程序讀取和刷寫的映像。有關屬性,請參見下面幾部分:
文件格式
所有字段都采用無符號的小端字節序
文件包含一個文件標頭,后跟一系列區塊
文件標頭、區塊標頭和區塊數據全部都是 4 個字節長的倍數
標頭
32 位魔數:0xed26ff3a
16 位 Major 版本 (0x1) - 拒絕 Major 版本更高的映像
16 位 Minor 版本 (0x0) - 允許 Minor 版本更高的映像
以字節為單位的 16 位文件標頭大小(在 v1.0 中為 28 位)
以字節為單位的 16 位區塊標頭大小(在 v1.0 中為 12 位)
以字節為單位的 32 位塊大小,必須是 4 的倍數
輸出文件中的 32 位塊總大小
輸入文件中的 32 位區塊總大小
原始數據的 32 位 CRC32 校驗和(將“隨意”算作 0 標準 802.3 多項式)使用公開域表格實現
區塊
16 位區塊類型:
0xCAC1 原始
0xCAC2 填充
0xCAC3 隨意
16 位保留(寫入為 0,讀取時忽略)
輸出映像中以塊為單位的 32 位區塊大小
區塊輸入文件中以字節為單位的 32 位總大小(包括區塊標頭和數據)
數據
對于原始類型,表示原始數據,即以塊為單位的大小 * 以字節為單位的塊大小
對于填充類型,表示 4 字節的填充數據
實現寫入程序
mke2fs 實用程序已經知道需要寫入映像的哪些區域,并且會在它們之間編碼“隨意”區塊。另一個工具 img2simg 會將常規(非稀疏)映像轉換為稀疏映像。常規映像沒有關于“隨意”區域的信息,轉換過程至多能做到的是查找重復數據塊,以減小所生成映像的大小。
實現讀取程序
讀取程序應拒絕 Major 版本未知的映像,但應接受 Minor 版本未知的映像。讀取程序可能會拒絕區塊大小不受其支持的映像。
Major 版本經過驗證后,讀取程序應忽略具有未知類型字段的區塊。它應使用“文件中的區塊大小”跳過文件中的區塊,并跳過輸出中的“以塊為單位的區塊大小”塊。
應針對將要寫入磁盤的數據計算循環冗余校驗 802.3 CRC32。任何未寫入的區域(隨意區域或跳過的區塊)都應在 CRC 中算作 0。應將寫入或跳過的總塊數與標頭中的“總塊數”字段進行比較。simg2img 工具會將稀疏映像格式轉換為標準映像,這樣會丟失稀疏信息。
總結
以上是生活随笔為你收集整理的android10分区镜像,分区和映像 | Android 开源项目 | Android Open Source Project的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 activemq,activem
- 下一篇: android 双 webview,An