***************************************************************************************************************************
作者:EasyWave 時間:2013.07.28
類別:Android系統源碼分析 聲明:轉載,請保留連結
注意:如有錯誤,歡迎指正。這些是我學習的日誌文章......
***************************************************************************************************************************
一):Linux是如何Andriod的呢
我們都知道在Linux系統開機檔案系統的時候,一般會在Linux核心中指定command line,如下所示:
從圖片中我們可以看到,在linux核心的配置中,有個Boot options的選項,進入之後,我們可以看到有這樣的一行命令:
console=ttySAC0 root=/dev/mtdblock2 rootfstype=cramfs init=/linuxrc
這行非常重要,要想成功的啟動Andriod系統,最需要關注的是init=/linuxrc,這個在後面詳細的講解,現在我們來看看核心啟動之後,都會幹些什麼事情呢,具體的情參考我的另一篇博文:MACHINE_START and MACHINE_END
Macro define 這裡面詳細的介紹了Linux是如何啟動的,這裡我們只關注這個函數:static noinline int init_post(void)如下所示:
我們可以看到,核心啟動後,會自動的去找前面指定的init=/linuxrc,如果找不到的話,那麼他就會去找下面的/sbin/init、/etc/init等等。而在andriod的檔案系統中正好是在根目錄下有個linuxrc檔案,如何看到呢,我們可以通過命令解壓ramdisk.img,步驟如下[以OK6410的Andriod系統為例]:
在命令列輸入命令: cp ramdisk.img ramdisk.img.gz
之後建立一個檔案夾,如:mkdir test,然後複製ramdisk.img.gz到建立的test檔案中,之後採用命令:gunzip ramdisk.img.gz進行解壓,最後才採用如下的命令:
cpio -i -F ramdisk.img 就將檔案系統解壓出來了,如下所示:
我們可以在test檔案夾中看到一個linuxrc的檔案,如下所示:
最後,我們開啟linuxrc檔案看看裡面的內容,如下所示:
看到最後一行/init的嗎,不錯,Linux核心是通過command line來載入linuxrc,進而linuxrc中載入了/init的Andriod的守護進程init。