本文轉載自:http://blog.csdn.net/jerome198707/article/details/41512419
高通分區模塊總結
1.MBR和GPT
目前分區模式,主要有兩種:BIOS+硬盤MBR分區和EFI和硬盤GPT分區。
BIOS+硬盤MBR分區是沿用了數十年的引導模式,MBR分區的標准決定了MBR只支持在2TB以下的硬盤,超過2TB的硬盤只能管理2TB。為解決這個大問題,微軟和英特爾在EFI方案中開發了GPT分區模式。隨着不久的將來硬盤容量突破2TB,BIOS+MBR組合估計會被主板EFI和硬盤GPT分區的組合模式取代了。
GPT,全球唯一標識分區表(GUIDPartition Table),GUID,全球唯一標識符(Globally Unique Identifier)。GPT是EFI方案的一部分,但並不依賴於EFI主板,在BIOS主板的PC中也可使用GPT分區。與MBR最大4個分區表項的限制相比,GPT對分區數量沒有限制,但Windows最大僅支持128個GPT分區。GPT可管理硬盤大小達到了18EB(1EB=1024PB=1,048,576TB),不過NTFS格式最大僅支持256TB。
1.1MBR說明
主引導記錄(MasterBootRecord,縮寫:MBR),又叫做主引導扇區,是計算機開機后訪問的首個扇區,它在硬盤上的三維地址為(柱面,磁頭,扇區)=(0,0,1)。MBR的大小為512字節,包括引導程序、主分區表和引導記錄,主分區表為64個字節,每個分區表的描述信息為16個字節,里面最多只能放4個分區表信息,這也是用MBR引導只能支持四個分區的原因。MBR結構見表1.
1.2GPT說明
GPT(GUIDPartition Table)屬於EFI 方案中的一部分。GPT為了兼容MBR,LBA0 依舊保留了MBR的結構。在GPT工作時,會優先讀取GPT (LBA1) 內容。如果沒有GPT 內容,則認為這是一塊MBR磁盤。再從LBA0 讀取MBR。在硬盤末尾,GPT備份了一份,這樣當GPT出錯時,可以快速的從硬盤末尾恢復。LBA-1 (負1)表示倒數第一塊LBA。
從LBA2 到LBA 33 ,一共預留了128 個分區表空間。GPT 支持在一塊硬盤上創建128 個分區。GPT分區表的結構如圖1所示
圖1GPT分區表結構圖
1.2.1LBA 0 protecttive MBR
在GPT分區表的最開頭,處於兼容性考慮仍然存儲了一份傳統的MBR,用來防止不支持GPT的硬盤管理工具錯誤識別並破壞硬盤中的數據,這個MBR也叫做保護MBR。在支持從GPT啟動的操作系統中,這里也用於存儲第一階段的啟動代碼。在這個MBR中,只有一個標識為0xEE的分區,以此來表示這塊硬盤使用GPT分區表。不能識別GPT硬盤的操作系統通常會識別出一個未知類型的分區,並且拒絕對硬盤進行操作,除非用戶特別要求刪除這個分區。這就避免了意外刪除分區的危險。另外,能夠識別GPT分區表的操作系統會檢查保護MBR中的分區表,如果分區類型不是0xEE或者MBR分區表中有多個項,也會拒絕對硬盤進行操作。
1.2.2LBA 1 GPT Heard
分區表頭定義了硬盤的可用空間以及組成分區表的項的大小和數量。最多可以創建128個分區,即分區表中保留了128個項,其中每個都是128字節。(EFI標准要求分區表最小要有16,384字節,即128個分區項的大小)
分區表頭還記錄了這塊硬盤的GUID,記錄了分區表頭本身的位置和大小(位置總是在LBA1)以及備份分區表頭和分區表的位置和大小(在硬盤的最后)。它還儲存着它本身和分區表的CRC32校驗。固件、引導程序和操作系統在啟動時可以根據這個校驗值來判斷分區表是否出錯,如果出錯了,可以使用軟件從硬盤最后的備份GPT中恢復整個分區表,如果備份GPT也校驗錯誤,硬盤將不可使用。所以GPT硬盤的分區表不可以直接使用16進制編輯器修改。
LBA 1 有512bytes大小的空間,里面放的就是GPTHeard,基本結構,見表2
表2GPT頭的基本結構
1.2.3LAB2~LAB33 GPT分區表項
GPT分區表主要描述分區的類型起始地址和結束地址,屬性和分區名見表3
表3GPT分區表項的格式
2.分區配置文件partition.xml
partition.xml是分區配置文件,用於指定具體有分區名稱、分區大小和類型,用於生成GPT分區表。
2.1參數說明
WRITE_PROTECT_BOUNDARY_IN_KB:
寫保護區域的基准大小,一般標准的設置為64M
GROW_LAST_PARTITION_TO_FILL_DISK:
如果為真,最后一個分區的大小會自動調整為emmc剩余所有空間大小,充分利用空間。如果為假,最后一個分區將按你設定的大小去分配分區大小。
partitionlabel : 分區名字
size_in_kb: 分區大小
type: 分區類型
bootable: 是否可以引導
readonly: 是否為只讀
filename: 分區對應的鏡像名字
sparse: 燒錄的鏡像是否是展開的
system分區的partition.xml文件配置,如下圖2所示
圖2system 分區配置信息
該文件是system分區的配置文件,主要作用包括:
WRITE_PROTECT_BOUNDARY_IN_KB =65536 寫保護區域的基准大小為64M,保證同一讀寫屬性的分區64M對齊
GROW_LAST_PARTITION_TO_FILL_DISK=true 最后一個分區的大小會自動擴充到最大
<partitionlabel="system" 指定分區的名字為system
size_in_kb="819200" 指定分區大小為800M
type="EBD0A0A2-B9E5-4433-87C0-68B6B72699C7"分區類型為數據分區
bootable="false" 設置該分區為不可引導分區
readonly="true" 讀寫屬性為只讀
filename="system.img" 分區對應的鏡像名字
sparse="true" 燒錄鏡像是展開的鏡像文件
2.分區鏡像配置文件Boardconfig.mk
device/qcom/msmxx/Boardconfig.mk作用:
1.指定對應分區鏡像文件格式化的大小
2.分區鏡像文件的文件系統類型
如圖3可知system被配置為400M,文件系統類型為ext4格式。
注:該值必須小於或等於partition.xml配置的大小partition.xml配置才是真正意義上的物理分區大小,越界將會導致分區加載失敗。
圖3 Boardconfig.mk配置文件
當編譯的時候makefile就會從Boardconfig.mk獲取system分區的大小和文件系統類型並用調用make_ext4fs 把out/target/product/msm8610/system的文件制作成大小為400Mext4格式的system.img分區壓縮文件,如下圖4所示
圖4 system.img 制作命令
注:編譯生成的system.img里面包含了對應分區的文件系統類型,以及掛載分區的大小,所以改變分區時一定要更新對應分區鏡像文件。
3.高通項目分區整改實例分析
高通平台的分區有25個基本分區,所用的引導方式是gpt引導方式,所有文件都是存放在MMC上,系統運行過程中,就會通過各分區名字從MMC的指定分區讀取相關的數據,高通提供的分區是一種通用的配置方式,由於要保證通用性的可行性,會造成空間資源的浪費,比如system鏡像問件的實際大小為300M目前分配的大小為800M,明顯浪費很大的存儲空間,所以需要對分區做進一步調整。
3.1實例一 增加vendor分區
本項目的分區整改要求如下所示,system.img分區由800M減小到400M,用於增加一個300M的vendor分區,見表4。
表4高通分區整改要求對比
更改分區文件
3.1.1修改partition.xml文件里面修改包括分區大小、類型和要燒寫鏡像的名字等等信息見圖5.
圖5 vendor分區配置圖
3.1.2.device/qcom/msmxx/Boardconfig.mk里面的分區宏,使這個分區恰好小於等於modem側的partition.xml分區大小,見圖6.
圖6system BoardConfig.mk
3.2實例二 增大userdata分區
整改要求:去除由於對齊造成的空間浪費,減小system分區大小為400M盡可能的為用戶增大userdata分區。
更改分區文件
3.2.1修改partition.xml文件里面做如下修改,見圖7。
1.WRITE_PROTECT_BOUNDARY_IN_KB =0
2.system分區的大小為400M
3.userdata的分區為3000M
圖7 partition.xml分區配置圖
3.2.2.device/qcom/msmxx/Boardconfig.mk修改分區鏡像文件格式化的大小,見圖8。
1.把system分區鏡像文件格式化的大小400M
2.userdata分區鏡像文件格式化的大小3000M
圖8Boardconfig.mk分區配置圖
圖9 userdata 增大后UI界面顯示效果圖
3.3編譯AP測代碼
重新編譯AP測代碼,更新AP側system和userdata的鏡像文件,生成新的system.img和userdata.img。
3.4拷貝
在modem\Linux\Android\下創建路徑out\target\product\
把生成的\out\target\product\msm8610文件全部拷貝到modem側代碼modem\LINUX\android\out\target\product\路徑下見圖10。
圖10路徑圖
3.5編譯modem側代碼
執行命令pythonupdate_common_info.py重新編譯modem
3.6燒寫
3.6.1把\common\build\bin\asic下的pil_split_binsh、sparse_images和NON-HLOS文件拷貝到燒寫的文件根目錄下,見圖11。
圖11路徑圖
3.6.2common\build下的gpt_main0、gpt_backup0、patch0.xml拷貝到燒寫的文件根目錄下
最后用emmcsoftware download 下載到機器里面,見圖12。
圖12路徑圖
4.減少分區空間浪費措施
1.計算每個鏡像的分區大小,留有足夠預留空間合理分配每個分區大小
2.在進行分區布局的時候,盡量讓讀寫屬性一致的放在一起,這樣就可以減少由於對齊造成的空間浪費。
3.通過設置WRITE_PROTECT_BOUNDARY_IN_KB來改變寫保護區域的基准大小。
4.GROW_LAST_PARTITION_TO_FILL_DISK:最好設置為真,這樣最后一個分區就會擴展到最大這樣保證不浪費emmc存儲空間。
5.注意事項
1.emmcsoftware download 所依賴的分區信息和系統啟動時加載的gpt分區信息必須一致。
(1)emmc software download燒寫各類鏡像文件所依賴的分區信息是從rawprogram_unsparse獲得的該燒寫軟件就是通過該文件獲取各分區的起始地址和分區大小,並把各鏡像文件燒錄到指定位置。
(2)系統運行時bootloader會從mmc的512字節(前面512字節是MBR)地址處讀取文件gpt_main0和gpt_backup0來獲取各分區的起始地址和大小,並去指定位置鏡像文件.
因此rawprogram_unsparse文件必須是編譯gpt_main0和gpt_backup0生成的最新文件,地址必須匹配,否則系統運行后將找不到相應鏡像文件,而無法運行。
rawprogram_unsparse文件是編譯gpt_main0和gpt_backup0生成的,路徑在\common\build\bin\asic\sparse_images下
2.分區時防止越界
在改變分區大小時,要防止自己的分區大小總和不能超過emmc的總大小,否則越界的分區時將會出錯。系統穩定性將得不到保證。