一文讀懂linux系統啟動過程
時間:2024-01-10 來源:華清遠見
講linux啟動過程前,我們先來聊一些背景知識:
Linux系統的線性地址中,0xA0000以上是用于圖形接口和BIOS的內存,0xA0000以下的基本內存中,開頭64KB是保留給BIOS和Linux內核引導的。因此,實際可用于內核映象的空間是508KB。內核映象是經過壓縮的,可以生成小映象(zImage)或大內核(bzImage)。bzImage因為太大,會裝載在地址為0x100000(1MB)的地方。無論哪種映象,解除壓縮后的內核映象總是放在地址為0x100000(1MB)的地方。
接下來我們聊聊Linux系統啟動過程:
1. 加載BIOS:BIOS是計算機硬件和軟件的接口,當計算機打開電源后,Linux啟動的第一步是BIOS加載。嵌入式產品中,這是一段系統引導程序,比較常見的是bootloader。
主要任務包括:硬件基本初始化、自搬移到內存、搬移內核到內存、搬移設備樹到內存、傳遞內核啟動參數
2. 加載內核(kernel):內核自解壓:內核在加載到內存后,首先會進行自解壓,確保內核代碼正確地展開。
a. 內核合法性檢測:內核代碼會對CPU類型和機器類型進行檢測,確保內核與目標硬件兼容。
b. 內核C部分運行:內核的C部分代碼開始執行,這是內核的主要功能部分。
c. CPU、機器參數安裝:內核會根據硬件配置安裝CPU和機器參數。
d. 初始化硬件:內核會初始化中斷、定時、終端、內存等最基本的硬件組件。
e. 創建核心進程:內核會創建一個核心進程,這是系統中的第一個進程,用于執行多任務調度。
3. 掛載rootfs:掛載文件系統 (mount_root)
4. 運行應用程序:內核加載完畢后,會啟動Linux系統中的第一個進程,即init進程。init進程的作用是設定Linux的啟動等級。init進程是所有進程的起點,如果不啟動init進程,其余所有進程都無法啟用。Linux系統所有的進程都是init進程的子進程。系統開機過程中,許多程序需要開機啟動,這些程序在Windows系統中被稱為“服務”,而在Linux系統中被稱為“守護進程”。系統初始化主要通過rc.sysinit來進行,rc執行完畢后返回init。基本系統環境設置好,各種守護進程也已經啟動。init會打開6個終端,以便用戶登錄系統。

