linux內核啟動的入口介紹及說明
Linux內核啟動的入口點根據(jù)架構不同而有所差異
主要分為以下幾個關鍵階段和入口位置:
1.鏈接腳本定義的初始入口
內核鏡像通過vmlinux.lds鏈接腳本指定入口符號,ARM架構通常為_text或stext,x86架構則為startup_32或startup_64。該入口位于.head.text段,由匯編代碼實現(xiàn)。
2.架構相關入口函數(shù)
- ARM架構:
arch/arm/kernel/head.S中的stext函數(shù),負責關閉MMU/D-Cache、校驗處理器類型、創(chuàng)建初始頁表等硬件初始化。 - x86架構:
arch/x86/boot/header.S中的startup_32(32位)或startup_64(64位),完成實模式到保護模式切換、解壓內核等操作。
3.通用內核入口
架構相關初始化完成后,統(tǒng)一跳轉到C語言編寫的start_kernel()函數(shù)(位于init/main.c),這是內核初始化的核心入口,負責調度器、內存管理等子系統(tǒng)初始化。
4.啟動流程關鍵節(jié)點
- Bootloader加載壓縮內核鏡像并傳遞參數(shù)
- 解壓程序(如
head.o/misc.o)解壓內核主體 - 執(zhí)行架構特定的
__primary_switch等函數(shù)切換到虛擬地址空間 - 最終通過
rest_init()創(chuàng)建init進程(用戶態(tài)第一個進程)。
不同架構的入口實現(xiàn)雖存在差異,但均遵循“匯編初始化→跳轉C代碼→完成核心初始化”的流程模式。
Linux內核啟動流程可分為以下幾個關鍵階段
固件初始化階段
- BIOS/UEFI執(zhí)行硬件自檢(POST)并加載引導程序
- 傳統(tǒng)BIOS讀取MBR,UEFI通過ESP分區(qū)查找引導程序
- GRUB等引導加載程序將壓縮內核(vmlinuz)和initramfs加載到內存
內核解壓階段
- 執(zhí)行壓縮內核頭部的解壓程序(head.o/misc.o)
- 解壓后跳轉到架構特定入口:x86為startup_32/64,ARM為stext
- 完成實模式到保護模式切換(32位)或直接進入長模式(64位)
早期初始化階段
- 關閉中斷并初始化臨時頁表
- 檢測CPU特性(PAE/SSE等)和內存布局
- 設置初始堆棧和異常處理機制
核心初始化階段(start_kernel)
- 初始化調度器(sched_init)和內存管理(mem_init)
- 建立伙伴系統(tǒng)和slab分配器
- 初始化中斷子系統(tǒng)(IDT/PIC)和控制臺
- 加載驅動模塊并探測硬件設備
用戶空間過渡階段
- 通過rest_init()創(chuàng)建內核線程kthreadd
- 掛載根文件系統(tǒng)并執(zhí)行/sbin/init(或systemd)
- 移交控制權給用戶空間第一個進程(PID 1)
關鍵架構差異
- x86:通過bootsect.S→setup.S→head.S三級跳轉
- ARM:直接由stext入口執(zhí)行向量表和頁表初始化
- 嵌入式系統(tǒng)可能跳過initramfs直接掛載根文件系統(tǒng)
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
CentOS8出現(xiàn)-bash:亂碼問題及解決方法
這篇文章主要介紹了CentOS8出現(xiàn)-bash:亂碼問題及解決方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04

