linux啟動流程分析 ,這裡僅簡要分析linux的大致啟動流程,更多細節請閱讀原始碼分析。
linux核心啟動過程分為解壓和啟動vmlinux。
啟動過程從核心映像入口開始執行,解壓 vmlinux (核心自引導)並且轉換到虛擬位址空間,再呼叫統一的核心啟動函式start_kernel(),從而啟動整個 linux 系統。
1.解壓vmlinux
什麼是vmlinux?
zimage映像的入口**是自引導程式。自引導程式包含一些初始化工作,這些工作包括什麼呢?
參看:arch/arm/boot/compressed/head.s,包括設定載入執行zimage的起始和結束位址,儲存體系結構id,關閉中斷,設定bss等。
然後,進行解壓核心映像並跳轉到虛擬空間啟動vmlinux。(應該說是解壓核心映象到記憶體)
2.啟動vmlinux
這時執行到vmlinux 的入口位址,順序執行核心啟動程式。
首先,還是有一些初始化工作,包括檢測並保持處理器型別和機器型號,開啟mmu並跳轉到start_kernel。
然後,執行linux系統初始化。start_kernel 函式是 linux 核心通用的初始化函式。
參見init/main.c。
start_kernel()函式負責初始化核心各子系統,最後呼叫 rest_init(),啟動乙個叫作 init的核心執行緒,繼續初始化。
在 init 核心執行緒中,將執行 init()函式的程式。init 函式負責完成掛接根檔案系統、初始化裝置驅動和啟動使用者空間的
init程序等重要工作。
對於 linux 系統來說,掛接根檔案系統、初始化裝置驅動和啟動使用者空間的程式是必要的3項工作。
2.1掛接根檔案系統
什麼是根檔案系統?
2.2初始化裝置驅動
cpu子系統已經正常工作,記憶體管理和程序管理已經正常運轉,但是還沒有使用任何裝置。
接下來繼續初始化核心裝置驅動程式,然後才能訪問裝置,做系統真正想要做的任務。
linux核心映像把裝置驅動程式的初始化函式指標鏈結成陣列,即__initcall_start和__initcall_end之間的資料。然後通過
do_initcalls()函式呼叫陣列中的函式指標,完成驅動程式的初始化。
2.3啟動使用者空間的程式
核心掛接跟檔案系統成功以後,將通過run_init_process()函式執行應用程式。這是乙個嘗試的過程,如果execute_command
存在,則執行execute_command;如果不存在,則順序執行/sbin/init、/etc/init、/bin/init、/bin/sh,直到有乙個執行成功為止。
linux核心啟動過程
第一步 電腦加電後cpu開始自身初始化,然後從某個固定位置 一般為0xfffffff0 取指令開始執行,此指令為跳轉指令,跳轉到bios 首部。第二步 bios開始加電自檢進行post power on self test 此階段完成系統硬體檢測,包括記憶體 系統匯流排檢測等,然後bios讀取啟動裝...
Linux核心啟動過程
linux核心啟動過程 第一篇日誌就摘錄一下linux核心的啟動過程,參考了 linux核心移植和yaffs2根檔案系統製作 嵌入式linux系統從軟體角度看可以分為四部分 引導引導程式 bootloader linux核心,檔案系統,應用程式。bootloader是系統啟動時執行的第一段 它主要用...
Linux 核心啟動過程
核心啟動前需要滿足的條件 暫存器,cpu,cache mmu 1.cpu暫存器的設定 r0 0 r1為機器碼 r2為啟動引數,標記列表在ram中的起始位址 2.cpu工作模式 必須禁止中斷 irq和fiq cpu必須設定為svc模式 3.cache和mmu的設定 mmu必須關閉 指令cache可以開...