Android 的啟動流程

2021-06-28 01:51:27 字數 3157 閱讀 1089

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主要用來拉起作...