




版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 傳統(tǒng)手工藝的職業(yè)成長(zhǎng)設(shè)計(jì)計(jì)劃
- 道德故事在課堂教學(xué)中的應(yīng)用計(jì)劃
- 推動(dòng)智慧辦公提升工作效率計(jì)劃
- 中職電子商務(wù)企業(yè)管理實(shí)踐的案例分享試題及答案
- 獸醫(yī)技術(shù)評(píng)估與分析試題及答案
- 動(dòng)物心理行為管理試題及答案
- 基金從業(yè)資格理念剖析試題及答案
- 世界各國(guó)教育改革狀況
- 2024年預(yù)算員證書(shū)考試綜合分析題試題及答案
- 電商創(chuàng)新模式與技術(shù)試題及答案
- 二十案例示輪回
- 老年?duì)I養(yǎng)示范化病房創(chuàng)建方案
- 設(shè)備安全操作培訓(xùn)
- 西方文化概論(第二版)課件全套 曹順慶 第0-6章 緒論 西方文化的淵源與流變、西方文學(xué) -西方社會(huì)生活與習(xí)俗
- 某地區(qū)現(xiàn)代有軌電車施工方案
- GB/T 6974.3-2024起重機(jī)術(shù)語(yǔ)第3部分:塔式起重機(jī)
- DB11T 2103.1-2023 社會(huì)單位和重點(diǎn)場(chǎng)所消防安全管理規(guī)范 第1部分:通則
- 物業(yè)品質(zhì)巡查管理制度
- 高中物理-《互感與自感》課件-新人教版選修3
- 養(yǎng)殖林麝合作協(xié)議書(shū)模板
- 鋼鐵項(xiàng)目環(huán)評(píng)報(bào)告 - 2工程分析
評(píng)論
0/150
提交評(píng)論