Android-根文件系統(tǒng)啟動(dòng)過(guò)程_第1頁(yè)
Android-根文件系統(tǒng)啟動(dòng)過(guò)程_第2頁(yè)
Android-根文件系統(tǒng)啟動(dòng)過(guò)程_第3頁(yè)
Android-根文件系統(tǒng)啟動(dòng)過(guò)程_第4頁(yè)
Android-根文件系統(tǒng)啟動(dòng)過(guò)程_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android根文件系統(tǒng)啟動(dòng)過(guò)程[置頂]Android根文件系統(tǒng)啟動(dòng)過(guò)程分類:Andriod2012-01-0518:15515人閱讀評(píng)論(1)收藏舉報(bào)androidactionsignalsystemjavaapi在Android系統(tǒng)啟動(dòng)時(shí),內(nèi)核引導(dǎo)參數(shù)上一般都會(huì)設(shè)置“init=/init”,這樣的話,如果內(nèi)核成功掛載了這個(gè)文件系統(tǒng)之后,首先運(yùn)行的就是這個(gè)根目錄下的init程序。這個(gè)程序所了什么呢?我們只有RFSC(ReadtheFuckingSourcecode)!!init程序源碼在Android官方源碼的system/core/init中,main在init.c里。我們的分析就從main開(kāi)始。init:(1)安裝SIGCHLD信號(hào)。(如果父進(jìn)程不等待子進(jìn)程結(jié)束,子進(jìn)程將成為僵尸進(jìn)程(zombie)從而占用系統(tǒng)資源。因此需要對(duì)SIGCHLD信號(hào)做出處理,回收僵尸進(jìn)程的資源,避免造成不必要的資源浪費(fèi)。)(2)對(duì)umask進(jìn)行清零。何為umask,請(qǐng)看/showArticle/53978.shtml(3)為rootfs建立必要的文件夾,并掛載適當(dāng)?shù)姆謪^(qū)。/dev(tmpfs)/dev/pts(devpts)/dev/socket/proc(proc)/sys(sysfs)(4)創(chuàng)建/dev/null和/dev/kmsg節(jié)點(diǎn)。(5)解析/init.rc,將所有服務(wù)和操作信息加入鏈表。(6)從/proc/cmdline中提取信息內(nèi)核啟動(dòng)參數(shù),并保存到全局變量。(7)先從上一步獲得的全局變量中獲取信息硬件信息和版本號(hào),如果沒(méi)有則從/proc/cpuinfo中提取,并保存到全局變量。(8)根據(jù)硬件信息選擇一個(gè)/init.(硬件).rc,并解析,將服務(wù)和操作信息加入鏈表。在G1的ramdisk根目錄下有兩個(gè)/init.(硬件).rc:init.goldfish.rc和init.trout.rc,init程序會(huì)根據(jù)上一步獲得的硬件信息選擇一個(gè)解析。(9)執(zhí)行鏈表中帶有“early-init”觸發(fā)的的命令。(10)遍歷/sys文件夾,是內(nèi)核產(chǎn)生設(shè)備添加事件(為了自動(dòng)產(chǎn)生設(shè)備節(jié)點(diǎn))。(11)初始化屬性系統(tǒng),并導(dǎo)入初始化屬性文件。(12)從屬性系統(tǒng)中得到ro.debuggable,若為1,則初始化keychord監(jiān)聽(tīng)。(13)打開(kāi)console,如果cmdline中沒(méi)有指定console則打開(kāi)默認(rèn)的/dev/console(14)讀取/initlogo.rle(一張565rle壓縮的位圖),如果成功則在/dev/graphics/fb0顯示Logo,如果失敗則將/dev/tty0設(shè)為T(mén)EXT模式并打開(kāi)/dev/tty0,輸出文本“ANDROID”字樣。(15)判斷cmdline中的參數(shù),并設(shè)置屬性系統(tǒng)中的參數(shù):1、如果bootmode為-factory,設(shè)置ro.factorytest值為1-factory2,設(shè)置ro.factorytest值為2-其他的設(shè)ro.factorytest值為02、如果有serialno參數(shù),則設(shè)置ro.serialno,否則為""3、如果有bootmod參數(shù),則設(shè)置ro.bootmod,否則為"unknown"4、如果有baseband參數(shù),則設(shè)置ro.baseband,否則為"unknown"5、如果有carrier參數(shù),則設(shè)置ro.carrier,否則為"unknown"6、如果有bootloader參數(shù),則設(shè)置ro.bootloader,否則為"unknown"7、通過(guò)全局變量(前面從/proc/cpuinfo中提取的)設(shè)置ro.hardware和ro.version。(16)執(zhí)行所有觸發(fā)標(biāo)識(shí)為init的action。(17)開(kāi)始property服務(wù),讀取一些property文件,這一動(dòng)作必須在前面那些ro.foo設(shè)置后做,以便/data/p不能干預(yù)到他們。-/system/p-/system/p-/data/p-在讀取默認(rèn)的property后讀取presistentpropertie,在/data/property中(18)為sigchldhandler創(chuàng)建信號(hào)機(jī)制(19)確認(rèn)所有初始化工作完成:device_fd(deviceinit完成)property_set_fd(propertyserverstart完成)signal_recv_fd(信號(hào)機(jī)制建立)(20)執(zhí)行所有觸發(fā)標(biāo)識(shí)為early-boot的action(21)執(zhí)行所有觸發(fā)標(biāo)識(shí)為boot的action(22)基于當(dāng)前property狀態(tài),執(zhí)行所有觸發(fā)標(biāo)識(shí)為property的action(23)注冊(cè)輪詢事件:-device_fd-property_set_fd-signal_recv_fd-如果有keychord,則注冊(cè)keychord_fd(24)如果支持BOOTCHART,則初始化BOOTCHART(25)進(jìn)入主進(jìn)程循環(huán):-重置輪詢事件的接受狀態(tài),revents為0-查詢action隊(duì)列,并執(zhí)行。-重啟需要重啟的服務(wù)-輪詢注冊(cè)的事件-如果signal_recv_fd的revents為POLLIN,則得到一個(gè)信號(hào),獲取并處理-如果device_fd的revents為POLLIN,調(diào)用handle_device_fd-如果property_fd的revents為POLLIN,調(diào)用handle_property_set_fd-如果keychord_fd的revents為POLLIN,調(diào)用handle_keychord由于對(duì)Android的屬性系統(tǒng)不是很了解,所以翻譯了這篇文章《AndroidPropertySystem》。每個(gè)屬性都有一個(gè)名稱和值,他們都是字符串格式。屬性被大量使用在Android系統(tǒng)中,用來(lái)記錄系統(tǒng)設(shè)置或進(jìn)程之間的信息交換。屬性是在整個(gè)系統(tǒng)中全局可見(jiàn)的。每個(gè)進(jìn)程可以get/set屬性。在系統(tǒng)初始化時(shí),Android將分配一個(gè)共享內(nèi)存區(qū)來(lái)存儲(chǔ)的屬性。這些是由“init”守護(hù)進(jìn)程完成的,其源代碼位于:device/system/init?!癷nit”守護(hù)進(jìn)程將啟動(dòng)一個(gè)屬性服務(wù)。屬性服務(wù)在“init”守護(hù)進(jìn)程中運(yùn)行。每一個(gè)客戶端想要設(shè)置屬性時(shí),必須連接屬性服務(wù),再向其發(fā)送信息。屬性服務(wù)將會(huì)在共享內(nèi)存區(qū)中修改和創(chuàng)建屬性。任何客戶端想獲得屬性信息,可以從共享內(nèi)存直接讀取。這提高了讀取性能??蛻舳藨?yīng)用程序可以調(diào)用libcutils中的API函數(shù)以GET/SET屬性信息。libcutils的源代碼位于:device/libs/cutils。API函數(shù)是:intproperty_get(constchar*key,char*value,constchar*default_value);intproperty_set(constchar*key,constchar*value);而libcutils又調(diào)用libc中的__system_property_xxx函數(shù)獲得共享內(nèi)存中的屬性。libc的源代碼位于:device/system/bionic。屬性服務(wù)調(diào)用libc中的__system_property_init函數(shù)來(lái)初始化屬性系統(tǒng)的共享內(nèi)存。當(dāng)啟動(dòng)屬性服務(wù)時(shí),將從以下文件中加載默認(rèn)屬性:/p/system/p/system/p/data/p屬性將會(huì)以上述順序加載。后加載的屬性將覆蓋原先的值。這些屬性加載之后,最后加載的屬性會(huì)被保持在/data/property中。特別屬性如果屬性名稱以“ro.”開(kāi)頭,那么這個(gè)屬性被視為只讀屬性。一旦設(shè)置,屬性值不能改變。如果屬性名稱以“persist.”開(kāi)頭,當(dāng)設(shè)置這個(gè)屬性時(shí),其值也將寫(xiě)入/data/property。如果屬性名稱以“net.”開(kāi)頭,當(dāng)設(shè)置這個(gè)屬性時(shí),“net.change”屬性將會(huì)自動(dòng)設(shè)置,以加入到最后修改的屬性名。(這是很巧妙的。netresolve模塊的使用這個(gè)屬性來(lái)追蹤在net.*屬性上的任何變化。)屬性“ctrl.start”和“ctrl.stop”是用來(lái)啟動(dòng)和停止服務(wù)。每一項(xiàng)服務(wù)必須在/init.rc中定義.系統(tǒng)啟動(dòng)時(shí),與init守護(hù)進(jìn)程將解析init.rc和啟動(dòng)屬性服務(wù)。一旦收到設(shè)置“ctrl.start”屬性的請(qǐng)求,屬性服務(wù)將使用該屬性值作為服務(wù)名找到該服務(wù),啟動(dòng)該服務(wù)。這項(xiàng)服務(wù)的啟動(dòng)結(jié)果將會(huì)放入“init.svc.<服務(wù)名>“屬性中??蛻舳藨?yīng)用程序可以輪詢那個(gè)屬性值,以確定結(jié)果。Androidtoolbox程序Androidtoolbox程序提供了兩個(gè)工具:setprop和getprop獲取和設(shè)置屬性。其使用方法:getprop<屬性名>setprop<屬性名><<屬性值>Java在Java應(yīng)用程序可以使用System.getProperty()和System.setProperty()函數(shù)獲取和設(shè)置屬性。Action默認(rèn)情況下,設(shè)置屬性只會(huì)使"init"守護(hù)程序?qū)懭牍蚕韮?nèi)存,它不會(huì)執(zhí)行任何腳本或二進(jìn)制程序。但是,您可以將您的想要的實(shí)現(xiàn)的操作與init.rc中某個(gè)屬性的變化相關(guān)聯(lián).例如,在默認(rèn)的init.rc中有:#adbdonatbootinemulatoronproperty:ro.kernel.qemu=1startadbdonproperty:persist.service.adb.enable=1startadbdonproperty:persist.service.adb.enable=0stopadbd這樣,如果你設(shè)置persist.service.adb.enable為1,"init"守護(hù)程序就知道需要采取行動(dòng):開(kāi)啟adbd服務(wù)。文章中提到的共享內(nèi)存就是Android特有的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論