分析Android 根檔案系統啟動

2021-06-19 19:31:07 字數 2665 閱讀 3859

在android系統啟動時,核心引導引數上一般都會設定「init=/init」, 這樣的話,如果核心成功掛載了這個檔案系統之後,首先執行的就是這個根目錄下的init程式。這個程式所了什麼呢?我們只有rfsc(read the ****ing source code)!!

init程式原始碼在android官方原始碼的system/core/init中,main在init.c裡。我們的分析就從main開始。

init:

(1)安裝sigchld訊號。(如果父程序不等待子程序結束,子程序將成為殭屍程序(zombie)從而占用系統資源。因此需要對sigchld訊號做出處理,**殭屍程序的資源,避免造成不必要的資源浪費。)

(2)對umask進行清零。

何為umask,請看

(3)為rootfs建立必要的資料夾,並掛載適當的分割槽。

/dev (tmpfs)

/dev/pts (devpts)

/dev/socket

/proc (proc)

/sys 

(sysfs)

(4)建立/dev/null和/dev/kmsg節點。

(5)解析/init.rc,將所有服務和操作資訊加入鍊錶。

(6)從/proc/cmdline中提取資訊核心啟動引數,並儲存到全域性變數。

(7)先從上一步獲得的全域性變數中獲取資訊硬體資訊和版本號,如果沒有則從/proc/cpuinfo中提取,並儲存到全域性變數。

(8)根據硬體資訊選擇乙個/init.(硬體).rc,並解析,將服務和操作資訊加入鍊錶。

(9)執行鍊錶中帶有「early-init」觸發的的命令。

(10)遍歷/sys資料夾,是核心產生裝置新增事件(為了自動產生裝置節點)。

(11)初始化屬性系統,並匯入初始化屬性檔案。

(12)從屬性系統中得到ro.debuggable,若為1,則初始化keychord監聽。

(13)開啟console,如果cmdline中沒有指定console則開啟預設的/dev/console

(14)讀取/initlogo.rle(一張565 rle 壓縮的點陣圖),如果成功則在/dev/graphics/fb0顯示logo,如果失敗則將/dev/tty0設為text模式並開啟/dev/tty0,輸出文字「android」字樣。

(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

根檔案系統init程序分析

u boot 啟動核心 核心 啟動應用程式 核心啟動的第乙個應用程式是 sbin init,啟動的最終目的是啟動其他的應用程式。init程式 1 讀取配置檔案 2 解析配置檔案 3 執行應用程式 根據配置檔案 配置檔案 1 指定應用程式 2 什麼時候執行 busybody init main ini...

根檔案系統移植(1) 根檔案系統介紹

一 什麼是根檔案系統 1 首先明白一點,我們的檔案在硬碟上的儲存並非是連續存放的,而是零散的存放在硬碟中的某些空餘扇區中的,這就導致了我們很難去檢視我們存放的檔案 因為人無法記住所有檔案存放在哪些扇區,已經扇區的順序 這時就有了我們的檔案系統,所以簡單來講,檔案系統就是對乙個儲存裝置上的資料和元資料...

linux檔案系統與根檔案系統

檔案系統 與 根檔案系統 要不我們就統一簡稱為fs和rfs 檔案系統 file system fs 根檔案系統 root file system rfs。首先你考慮一點描述語句 根檔案系統也是一種 檔案系統 可以認為是一種 特殊的 檔案系統 為什麼是叫 特殊的 呢?是因為這種 根 檔案系統 承載著某...