基本上,有了kernel之後,我們只差Android檔案系統就能開機了。

Android SDK中有現成的檔案系統,不過我們之後需要做部份修改,

所以還是從source code開始編譯。

 

首先要取得整個Android平台的source code,這次用的是Repo:

Using Repo and Git

$ curl http://android.git.kernel.org/repo >~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir working-directory-name
$ cd working-directory-name
$ repo init -u git://android.git.kernel.org/platform/manifest.git

$ repo sync


等待下載完成。



這裡假設'working-directory-name'為'$(andsrc)',

在這裡我們先直接編譯,不作任何修改:

$ cd $(andsrc)

$ make

編譯時間約為2.5小時(Intel Core 2 Solo U3500@1.4GHz),大約需要8GB的硬碟空間。

編譯完的file system會在$(andsrc)/out/target/product/generic下。

 

Android file system主要由三個部份構成:

1. ramdisk.img,包含檔案系統"/"下的所有檔案,除了/system和/data之外。

2. system.img,包含/system下的所有檔案。

3. data.img,包含/data下的所有檔案。

一般情況下,只要把整個file system包裝成JFFS2,再以SAM-BA燒入NAND即可。

但在Android下,/data資料夾的檔案系統必須支援memory-mapped操作,

而JFFS2不支援memory-mapped;Android所用的YAFFS2又無法以SAM-BA燒入。

 

這個問題有幾種可能的解法:

1. NFS (Network file system)

2. Ext3 on SD card

3. 在U-boot下,以TFTP將整個file system下載到NAND上

(NFS和Ext3皆支援memory-mapped operation)

其中方法1. 2. 已測試可行,在此我們以2. 為例。

 

要把整個檔案系統放在SD卡上,其實就是把檔案放對位置。

在Linux下,將SD卡插到讀卡機上,格式化分區為Ext3(fdisk and mkfs)。

假設其位置為/media/disk,則/media/disk資料夾相當於Android上的"/"位置。

我們不需要把.img檔解壓縮,因為

$(andsrc)/out/target/product/generic下的root、data和system資料夾,

分別是ramdisk.img、userdata.img和system.img解壓縮的檔案。

只要複製到對應的位置即可 (需要root權限):

$ sudo cp -r $(andsrc)/out/target/product/generic/root/* /media/disk/

$ sudo cp -r $(andsrc)/out/target/product/generic/data/ /media/disk/

$ sudo cp -r $(andsrc)/out/target/product/generic/system/ /media/disk/

 

接著我們要修改init.rc (/media/disk/init.rc)。

init.rc定義了init執行時所做的事,其中有mount /data和/system的動作,

但我們已經手動將這些資料夾放好,所以必須將這些指令刪除。

刪除init.rc中所有mount開頭的指令,只留下"mount tmpfs tmpfs /sqlite_stmt_journals size=4m"。

 

到此我們已經完成kernel和file system。下次試著把它們組合起來,試著開機看看。

(待續...)

arrow
arrow
    全站熱搜

    sheng7337 發表在 痞客邦 留言(1) 人氣()