linux核心啟動過程

2021-08-26 09:09:02 字數 1559 閱讀 2364

linux核心啟動過程完成啟動核心並執行使用者空間的init程序的功能。

當核心映像被載入到ram之後,bootloader的控制權被釋放。核心映像並不是可直接

執行的目標**,而是乙個壓縮過的zimage(小核心)或bzimage(大核心,bzimage中的

「b」是「big」意思)。

但是,並非zimage和bzimage映像中的一切都被壓縮了,映像中包含未被壓縮的

部分,這部分中包含解壓縮程式,解壓縮程式會解壓縮映像中被壓縮的部分。zimage

和bzimage都是用gzip壓縮的,它們不僅是乙個壓縮檔案,而且在這兩個檔案的開頭

部分內嵌有gzip解壓縮**。

如下圖所示,當bzimage(用於i386映像)被呼叫時,它從/arch/i386/boot/head.s

的start 彙編例程開始執行。這個例程子進行一些基本的硬體設定,並呼叫

/arch/i386/boot/compressed/head.s中的startup_32例程。startup_32 例程設定乙個基本的

執行環境(如堆疊)後清除bss 段,呼叫/arch/i386/boot/compressed/misc.c 中的

decompress_kernel()解壓縮核心。

x86 pc上的linux核心初始化

核心被解壓縮到記憶體中之後會再呼叫/arch/i386/kernel/head.s 檔案中的startup_32

例程,這個新的startup_32 例程(稱為清除程式或程序0)會初始化頁表,並啟用內

存分頁機制,接著為任何可選的浮點單元(fpu)檢測cpu 的型別,並將其儲存起

來供以後使用。

這些都做完之後,/init/main.c 中的start_kernel()函式被呼叫,進入與體系結構無關的

linux核心部分。

start_kernel()會呼叫一系列初始化函式來設定中斷,執行進一步的記憶體配置。之後,

/arch/i386/kernel/process.c 中kernel_thread()被呼叫以啟動第乙個核心執行緒,該執行緒執

行init() 函式,而原執行序列會呼叫cpu_idle(),等待排程。

作為核心執行緒的init()函式完成外設及其驅動程式的載入和初始化,掛接根檔案系統。

init()開啟/dev/console 裝置,重定向stdin、stdout 和stderr 到控制台。之後,它搜尋檔案

系統中的init程式(也可以由「init=」命令列引數指定init程式),並使用execve()系統調

用執行init 程式。搜尋init 程式的順序為/sbin/init、/etc/init、/bin/init和/bin/sh。在嵌入式

系統中,多數情況下,可以給核心傳入乙個簡單的shell 指令碼來啟動必需的嵌入式應用

程式。至此,漫長的linux 核心引導和啟動過程就結束了,而init()對應的由start_kernel()

建立的第乙個執行緒也進入使用者模式。

參考:系統初始化

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可以開...