1. 程式人生 > >Android 的 ramdisk.img、system.img、userdata.img 作用說明,以及UBoot 系統啟動過程

Android 的 ramdisk.img、system.img、userdata.img 作用說明,以及UBoot 系統啟動過程

一個分割槽影像檔案,它會在kernel 啟動的時候,以只讀的方式被 mount , 這個檔案中只是包含了 /init 以及一些配置檔案,這個ramdisk 被用來呼叫init,以及把真正的root file system mount 起來。
#其實ramdisk.img的內容就是/out/target/product/generic/root目錄的壓縮而已。

方法1: android編譯生成後的ramdisk.img是一個gzip格式的檔案,輸入命令 # file ramdisk.img, 會得到 =>ramdisk.img: gzip compressed data, from Unix

那麼先解壓ramdisk.img,因為字尾不是.gz,所以用—S選項, # gunzip -S .img ramdisk.img
這樣就得到一個新檔案ramdisk.img,用 # file ramdisk 檢視格式 , 得到 => ramdisk: ASCII cpio archive (SVR4 with no CRC)

可以看出解壓生成的ramdisk是cpio格式的檔案,再次解壓,為了防止解壓後檔案混亂,
首次建立一個目錄如: # mkdir rfs //rfs可以用來放ramdisk解壓後的檔案, 進入 # cd rfs
解壓 # cpio -i -F ../ramdisk

方法2: 將ramdisk.img復制一份到任何其他目錄下,將其改名為ramdisk.img.gz,然後使用命令 # gunzip ramdisk.img.gz,
然後新建一個資料夾ramdisk,進入,輸入命令 # cpio -i -F ../ramdisk.img


得到結果如下:
drwxr-xr-x 8 root root 4096 2011-01-12 11:36 ./
drwxr-xr-x 13 root root 4096 2011-01-12 11:35 ../
drwxrwx--x 2 root root 4096 2011-01-12 11:36 data/
-rw-r--r-- 1 root root 118 2011-01-12 11:36 default.prop
drwxr-xr-x 2 root root 4096 2011-01-12 11:36 dev/
-rwxr-x--- 1 root root 107784 2011-01-12 11:36 init*
-rwxr-x--- 1 root root 492 2011-01-12 11:36 init.freescale.rc*
-rwxr-x--- 1 root root 1677 2011-01-12 11:36 init.goldfish.rc*
-rwxr-x--- 1 root root 18263 2011-01-12 11:36 init.rc*
drwxr-xr-x 2 root root 4096 2011-01-12 11:36 proc/
drwxr-x--- 2 root root 4096 2011-01-12 11:36 sbin/
drwxr-xr-x 2 root root 4096 2011-01-12 11:36 sys/
drwxr-xr-x 2 root root 4096 2011-01-12 11:36 system/

#可以看出這寫檔案是和root目錄下的內容完全一樣,其實就是對root目錄的打包和壓縮。可以是用tree -L 1來檢視root的目錄

(2) system.img


它包含了整個系統,android 的framework,application 等等,會被掛接到 "/" 上,包含了系統中所有的二進位制檔案
# system.img是out/target.product/generic/目錄下system目錄的一個對映,類似與根檔案系統的映像,放著android 的應用程式、配置檔案和字型等。

[email protected]:~/lonshinetech/src/SPU_B0_R0_0/out/target/product/generic/system$ tree -L 1
.
|-- bin
|-- build.prop
|-- etc
|-- fonts
|-- framework
|-- lib
|-- usr
-- xbin

重新打包system.img 具體辦法
a) 在android編譯後生成的out目錄中查詢這個工具 mkyaffs2image
# find out/ -name mkyaffs2image
得到=>out/host/linux-x86/bin/mkyaffs2image
b) android編譯後會生成system/ 這個目錄,而這個目錄就是用來生成system.img的
# mkyaffs2image system/ system.img

(3) userdata.img


將會被掛接到 /data 下,包含了所有應用相關的配置檔案,以及使用者相關的資料 。



(4) Android啟動過程

Android啟動過程使,會由UBOOT傳入一個init引數,這個init引數制定了開機的時候執行的第一個執行的程式,預設就是init程式,這個程式就在ramdisk.img中,可以分析一下它的程式碼,看看在其中到底做了一些什麼樣的初始化任務,它的原始檔在system/core/init/init.c中。

它會呼叫init.rc初始化這個檔案,這個檔案在out/target/product/generic/root下。
android啟動時首先載入的是ramdisk.img映象,並掛載到/目錄下,並進行一系列的初始化動作,包括建立各種需要的目錄,初始化console,開啟服務等。system.img是在init.rc中指定一些指令碼命令,通過init.c進行解析並掛載到根目錄下的/system目錄下的。