1. 程式人生 > >通過分析mkbootimg原始碼瞭解boot.img檔案結構

通過分析mkbootimg原始碼瞭解boot.img檔案結構

平臺:Android 4.4.2

原始碼路徑:/system/core/mkbootimg

/*

** +-----------------+

** | boot header     | 1 page

** +-----------------+

** | kernel          | n pages 

** +-----------------+

** | ramdisk         | m pages 

** +-----------------+

** | second stage    | o pages

** +-----------------+

** | device tree     | 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 = (dt_size + page_size - 1) / page_size

**

** 0. all entities are page_size aligned in flash

** 1. kernel and ramdisk are required (size != 0)

** 2. second is optional (second_size == 0 -> no second)

** 3. load each element (kernel, ramdisk, second) at

**    the specified physical address (kernel_addr, etc)

** 4. prepare tags at tag_addr.  kernel_args[] is

**    appended to the kernel commandline in the tags.

** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr

** 6. if second_size != 0: jump to second_addr

**    else: jump to kernel_addr

*/

以上是bootimg.h中對boot.img結構的說明,所有的段在flash上都必須以page_size對齊。page_size預設為2KB,可以通過--pagesize後接十進位制數指定修改後的page_size,合理的page_size包括2KB,4KB, 8KB, 16KB.

kernel和ramdisk段是必須的,second段是可選的。啟動時需要將這些段載入到指定的實體地址,實體地址由boot header指定,boot header結構如下所示,三個段的載入地址分別是kernel_addr, ramdisk_addr, second_addr。tags_addr由引數--tags-addr後接一個16進位制數指定,bootloader需要將kernel_args附在commandline後組成完整的tags儲存到tag_addr指定的地址。

r0,r1,r2三個暫存器按照要求賦值,如果存在second段,那麼跳到second段執行,否則跳到kernel段執行。

#define BOOT_MAGIC "ANDROID!"

#define BOOT_MAGIC_SIZE 8

#define BOOT_NAME_SIZE 16

#define BOOT_ARGS_SIZE 512

struct boot_img_hdr

{

    unsigned char magic[BOOT_MAGIC_SIZE];

    unsigned kernel_size;  /* size in bytes */

    unsigned kernel_addr;  /* physical load addr */

    unsigned ramdisk_size; /* size in bytes */

    unsigned ramdisk_addr; /* physical load addr */

    unsigned second_size;  /* size in bytes */

    unsigned second_addr;  /* physical load addr */

    unsigned tags_addr;    /* physical addr for kernel tags */

    unsigned page_size;    /* flash page size we assume */

    unsigned dt_size;      /* device tree in bytes */

    unsigned unused;    /* future expansion: should be 0 */

    unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */

    unsigned char cmdline[BOOT_ARGS_SIZE];

    unsigned id[8]; /* timestamp / checksum / sha1 / etc */

};

以下是mkbootimg的使用說明,kernel, ramdisk, output是必須要指定引數的,其他是可選的。cmdline字串長度必須小於BOOT_ARGS_SIZE,boardname長度必須小於BOOT_NAME_SIZE。base是基地址,如果未指定的話為0x10000000。

還有幾個引數,下邊的說明沒有寫:--kernel_offset,--ramdisk_offset,--second_offset,--tags_offset。kernel_offset用來計算kernel_addr載入地址,預設為0x00008000。ramdisk_offset用來計算ramdisk_addr,預設為0x01000000。second_offset用來計算second_addr,預設為0x00f00000。tags_offset用來計算tags_addr,預設為0x00000100。計算地址的方式都是在base基礎上加上offset,這些值一般都是平臺相關的不會用預設值。需要注意的是如果指定了--tags-addr,那麼將忽略tags_offset的設定。

boot_img_hdr的id中目前的實現是儲存映象的hash值。

int usage(void)

{

    fprintf(stderr,"usage: mkbootimg\n"

            "       --kernel <filename>\n"

            "       --ramdisk <filename>\n"

            "       [ --second <2ndbootloader-filename> ]\n"

            "       [ --cmdline <kernel-commandline> ]\n"

            "       [ --board <boardname> ]\n"

            "       [ --base <address> ]\n"

            "       [ --pagesize <pagesize> ]\n"

            "       [ --dt <filename> ]\n"

            "       [ --tags-addr <address> ]\n"

            "       -o|--output <filename>\n"

            );

    return 1;

}

總結:mkbootimg程式碼還是比較簡單的,概括起來就是把幾個檔案按照boot.img結構打包。如果想使用SHA演算法可以參考這部分的程式碼。

相關推薦

通過分析mkbootimg原始碼瞭解boot.img檔案結構

平臺:Android 4.4.2 原始碼路徑:/system/core/mkbootimg /* ** +-----------------+ ** | boot header     | 1 page ** +-----------------+ ** | kernel

LeakCanary Android 記憶體洩漏分析利器 原始碼編譯配置mk檔案

LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := \ $(call all-java-files-under, src) LOCAL_SRC_

通過ADB命令刷入boot.img和recovery.img的方法

一個完整的官方rom解開如下所示boot.imgsystem.imgrecovery.imghboot.nb0data.imgcache.imgradio.img等等 我們所說的刷機也僅僅是boot.img引導分割槽加上system.img系統分割槽、那麼很多同學卡在第一屏

瞭解npm的檔案結構(npm-folders)和配置檔案(npm-mrc)

一、npm的檔案結構   npm的安裝:     本地安裝 1. 將安裝包放在 ./node_modules 下(執行 npm 命令時所在的目錄),如果沒有 node_modules 目錄,會在當前執行 npm 命令的目錄下生成 node_modules 目錄。 2. 可以通過 require() 來引

Lucene 原始碼剖析 二 索引檔案結構(1)

2           索引檔案 為了使用Lucene來索引資料,首先你得把它轉換成一個純文字(plain-text)tokens的資料流(stream),並通過它創建出Document物件,其包含的Fields成員容納這些文字資料。一旦你準備好些Document物件,你就

SNMP原始碼分析之(一)配置檔案部分

snmpd.conf想必不陌生。在程序啟動過程中會去讀取配置檔案中各個配置。其中幾個引數需要先知道是幹什麼的:   token:配置檔案的每行的開頭,例如 group MyROGroup v1 readSec 這行token的引數是group。  

HashTable與HashMap的區別,資料結構,類檔案結構原始碼分析

轉載https://www.imooc.com/article/details/id/23015 與HashMap的區別 1 HashMap是非同步的,沒有對讀寫等操作進行鎖保護,所以是執行緒不安全的,在多執行緒場景下會出現資料不一致的問題。而HashTable是同步的,所有的讀寫等操作都進

Vue原始碼分析(一):入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

從Android boot.img與recovery.img的解包中瞭解其資料組成

從Android boot.img與recovery.img的解包中瞭解其資料 又到了忙碌的季節,一次要處理N多事情。最近需要從boot.img中取出ramdisk。不同的專案中kernel是一樣的,ramdisk中的資源不一樣,直接取ramdisk與新編譯的kernel打包在一起,方便

通過編寫一個簡單的日誌類庫來加深瞭解C#的檔案訪問控制

在程式的開發除錯過程及釋出執行後的狀態監控中,日誌都有著極其重要的分量,通過在關鍵邏輯節點將關鍵資料記錄到日誌檔案當中能幫助我們儘快找到程式問題所在。網上有不少專業成熟的日誌元件可用,比如log4net和nlog等,由其專業及受歡迎程度可見日誌在一個程式中的重要性。 我只用過log4net,而在用log4n

關於在spring boot通過zuul閘道器上傳檔案使用MultipartFile獲取的方式出現檔名中文亂碼的問題

配置檔案中加入 spring.http.encoding.force=true spring.http.encoding.charset=utf-8 spring.http.encoding.enabled=true server.tomcat.uri-encodi

通過例項及原始碼分析關於SpringBoot啟動類啟動時自動配置問題

SpringBoot啟動類大家都不陌生,只要在main方法上增加一個@SpringBootApplication註解,就可以啟動了。 我們點開該註解 其中關鍵註解為@EnableAutoConfiguration,再次跟進 其中引入了EnableA

u-boot.lds檔案分析

u-boot.lds決定了u-boot可執行映像的連線方式,以及各個段的裝載地址(裝載域)和執行地址(執行域)。 GNU官方網站上對.lds檔案形式的完整描述: SECTIONS{ ... secname start BLOCK(align) (NOLOAD) : A

boot.img分析

3 boot.img的載入  在lk 中, smem_ptable_init 函式中會初始化 smem_apps_flash_start ,它通過讀share memory ,也就是ARM9端傳入的0:APPS   這樣在targe_init函式中,會將offset = smem_apps_flash_st

HLS學習(七)HLSDownloader原始碼分析(6)下載TS檔案片段

下載TS檔案片段 處理完Master PlayList和Media PlayList之後就可以開始下載TS視訊片段了 下載的流程如下: 1、初始化本地的檔名 2、設定本地檔案的訪問許可權 3、建立任務佇列 4、建立PlayList更新執行緒,因為伺服器上的m3u8檔案

android system.img,ramdisk.img,boot.img 分析

android 原始碼編譯後得到system.img,ramdisk.img,userdata.img映像檔案。其中, ramdisk.img是emulator的 檔案系統,system.img包括了主要的包、庫等檔案,userdata.img包括了一些使用者資料,emu

深入boot.img格式檔案結構解析

以msm8226為例,講解android原始碼編譯生成boot.img的結構。boot.img包括boot.img header、kernel以及ramdisk檔案系統。下面是對boot.img的結構進行解讀。   boot.img 檔案頭資訊的具體結構可以在system/

Cubietruck---8. u-bootboot.img簡略分析

一. u-boot的編譯與連結1. lichee下編譯命令[email protected]:/work/ct/lichee$  ./build.sh -p sun7i_android -m ubootu-boot的編譯是用指令碼lichee/u-boot/bui

imx平臺,通過fastboot燒寫boot.img system.img recovery.img映象

1.在串列埠上,進入u-boot模式,輸入fastbootMX6Q SABRESD U-Boot > fastbootfastboot is in init......flash target i

頭禿了,二十三張圖帶你從原始碼瞭解Spring Boot 的啟動流程~

持續原創輸出,點選上方藍字關注我 目錄 前言原始碼版本從哪入手?原始碼如何切分?如何建立SpringApplication? 設定應用型別設定初始化器(Initializer)設定監聽器(Listener)設定監聽器(Listener) 執行run()方法 獲取、啟動執行過程監聽器環境構建建立IOC