android 根檔案系統啟動過程。
在android系統啟動時,核心引導引數上一般都會設定「init=/init」, 這樣的話,如果核心成功掛載了這個檔案系統之後,首先執行的就是這個根目錄下的init程式。
init程式原始碼在android官方原始碼的system/core/init中,main在init.c裡。我們的分析就從main開始。
init:
(1)安裝sigchld訊號。(如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie)從而占用系統資源。因此需要對sigchld訊號做出處理,**殭屍程序的資源,避免造成不必要的資源浪費。)
(2)對umask進行清零。
當我們登入系統之後建立乙個檔案總是有乙個預設許可權的,那麼這個許可權是怎麼來的呢?這就是umask幹的事情。umask設定了使用者建立檔案的預設許可權,它與chmod的效果剛好相反,umask設定的是許可權「補碼」,而chmod設定的是檔案許可權碼。一般在/etc/profile、$ [home]/.bash_profile或$[home]/.profile中設定umask值。
umask命令允許你設定檔案建立時的預設模式,對應每一類使用者(檔案屬主、同組使用者、其他使用者)存在乙個相應的umask值中的數字。對於檔案來說,這一數字的最大值分別是6。系統不允許你在建立乙個文字檔案時就賦予它執行許可權,必須在建立後用chmod命令增加這一許可權。目錄則允許設定執行許可權,這樣針對目錄來說,umask中各個數字最大可以到7。
該命令的一般形式為:umask nnn
其中nnn為umask置000 - 777。
我們只要記住u m a s k是從許可權中「拿走」相應的位即可。下表是umask值與許可權的對照表:
umask 檔案 目錄
--------------------
0 6 7
1 6 6
2 4 5
3 4 4
4 2 3
5 2 2
6 0 1
7 0 0
--------------------
如:umask值為022,則預設目錄許可權為755,預設檔案許可權為644。
(3)為rootfs建立必要的資料夾,並掛載適當的分割槽。
/dev (tmpfs)
/dev/pts (devpts)
/dev/socket
/proc (proc)
/sys (sysfs)
(4)建立/dev/null和/dev/kmsg節點。
(5)解析/init.rc,將所有服務和操作資訊加入鍊錶。
if( load_565rle_image(init_image_file) )
}/system/core/init/init.c
/system/core/init/init.h
/system/core/init/init.rc
/system/core/init/logo.c
*.rle檔案的製作步驟:
a. 使用gimp或者advanced batch converter軟體,將圖象轉換為raw格式;
b. 使用android自帶的rgb2565工具,將raw格式檔案轉換為rle格式(如:rgb2565 -rle < initlogo.raw > initlogo.rle)。
(15)判斷cmdline 中的引數,並設定屬性系統中的引數:
1、 如果 bootmode為
- factory,設定ro.factorytest值為1
- factory2,設定ro.factorytest值為2
- 其他的設ro.factorytest值為0
2、如果有serialno引數,則設定ro.serialno,否則為""
3、如果有bootmod引數,則設定ro.bootmod,否則為"unknown"
4、如果有baseband引數,則設定ro.baseband,否則為"unknown"
5、如果有carrier引數,則設定ro.carrier,否則為"unknown"
6、如果有bootloader引數,則設定ro.bootloader,否則為"unknown"
7、通過全域性變數(前面從/proc/cpuinfo中提取的)設定ro.hardware和ro.version。
(16)執行所有觸發標識為init的action。
(17)開始property服務,讀取一些property檔案,這一動作必須在前面那些ro.foo設定後做,以便/data/local.prop不能干預到他們。
- /system/build.prop
- /system/default.prop
- /data/local.prop
- 在讀取預設的property後讀取presistent propertie,在/data/property中
(18)為sigchld handler建立訊號機制
(19)確認所有初始化工作完成:
device_fd(device init 完成)
property_set_fd(property server start 完成)
signal_recv_fd (訊號機制建立)
(20) 執行所有觸發標識為early-boot的action
(21) 執行所有觸發標識為boot的action
(22)基於當前property狀態,執行所有觸發標識為property的action
(23)註冊輪詢事件:
- device_fd
- property_set_fd
-signal_recv_fd
-如果有keychord,則註冊keychord_fd
(24)如果支援bootchart,則初始化bootchart
(25)進入主程序迴圈:
- 重置輪詢事件的接受狀態,revents為0
- 查詢action佇列,並執行。
- 重啟需要重啟的服務
- 輪詢註冊的事件
- 如果signal_recv_fd的revents為pollin,則得到乙個訊號,獲取並處理
- 如果device_fd的revents為pollin,呼叫handle_device_fd
- 如果property_fd的revents為pollin,呼叫handle_property_set_fd
- 如果keychord_fd的revents為pollin,呼叫handle_keychord
Android的啟動流程
uboot的啟動流程 uboot的啟動分為兩個階段。第一階段 設定異常向量表,設定arm核為svc模式,關cache和關mmu,關看門狗,初始化時鐘,串列埠,記憶體,初始化棧空間,清bss。跳轉到第二階 段。第二階段 硬體的初始化,讀取環境變數,將核心從emmc載入到記憶體中,呼叫核心 kernel...
android 啟動流程
bootload 載入linux 核心 掛載ramdisk.img init程式 啟動準備 解析init.rc 和init.hardware.rc 將early init action新增到action queue佇列中 將init action新增到action queue佇列中 進入迴圈 執行每...
Android啟動流程
當按下手機開機鍵的時候,究竟發生了什麼 android的啟動流程是乙個非常複雜的流程,如果有什麼遺漏,還望多多指教。這裡簡單說下基本的流程 1 當按下手機的開機鍵的時候,引導晶元 從與預定以 固化在rom 的地方開始執行。載入bootloader到ram中執行。2 bootloader主要用來拉起作...