Linux 核心啟動過程

2021-07-09 17:43:12 字數 1859 閱讀 4608

核心啟動前需要滿足的條件(暫存器,cpu,cache、mmu):

1. cpu暫存器的設定:

①r0 = 0

②r1為機器碼

③r2為啟動引數,標記列表在ram中的起始位址

2.cpu工作模式

①必須禁止中斷(irq和fiq)

②cpu必須設定為svc模式

3.cache和mmu的設定

①mmu必須關閉

②指令cache可以開啟或關閉

③資料cache必須關閉

linux 核心啟動過程

linux的啟動過程分為兩部分:

1.架構、開發板相關的引導過程。

2.後續的通用啟動過程。

arm架構處理器上linux核心vmlinux的啟動過程,之所以說是vmlinux,是因為其他格式的核心在進行與vmlinux相同的流程之前會有一些獨特的操作。比如:對於壓縮格式的核心zimage,首先進行自解壓得到vmlinux,然後執行vmlinux開始的「正常」啟動流程。

引導階段通常使用組合語言編寫,步驟:

1. 它首先檢查核心是否支援當前的處理器架構

2. 然後檢查是否支援當前開發板,通過檢查後

3. 就為呼叫下一階段的start_kernel函式做準備了

⑘①連線核心時使用的是虛擬位址,所以要設定頁表、使能mmu

②呼叫c函式start_kernel之前的常規工作,包括複製資料段,清楚bss段,呼叫start_kernel函式

第二階段的關鍵**主要使用c語言編寫。它進行核心初始化的全部工作,最後呼叫rest_init函式啟動init過程,建立系統第乙個程序:init程序。在第二階段,仍有部分架構/開發板相關的**,比如setup_arch函式用於進行架構/開發板相關的設定(比如重新設定頁表,設定系統時鐘,初始化串列埠等)。

head.s檔案中:

entry(stext)

__lookup_processor_type --->arch/arm/kernel/head.s

__lookup_machine_type ---> arch/arm/kernel/head-common.s

__create_page_tables ---> arch/arm/kernel/head.s

__cpu_flush ---> arch/arm/kernel/head.s

__enable_mmu ---> arch/arm/kernel/head.s 

__switch_data --->arch/arm/kernel/head-common.s

start_kernel --->/init/main.c

start_kernel --->/init/main.c

rest_init --->/init/main.c

kernel_init --->/init/main.c

init_post --->/init/main.c

__lookup_processor_type: 確定核心是否支援該架構

__lookup_machine_type:確定核心是否支援該單板

__create_page_tables:建立一級頁表

__arm920_setup:禁止icache、dcache

__enable_mmu:使能mmu

__mmap_switched:複製資料段,清楚bss段,設定棧指標,儲存cpu id到processor_id變數,儲存機器型別id到__machine_arch_type變數,呼叫start_kernel

init/main.c的start_kernel函式

printk(linux_version):輸出linux版本資訊

...console_init:初始化控制台

...rest_init:啟動init過程

linux核心啟動過程

第一步 電腦加電後cpu開始自身初始化,然後從某個固定位置 一般為0xfffffff0 取指令開始執行,此指令為跳轉指令,跳轉到bios 首部。第二步 bios開始加電自檢進行post power on self test 此階段完成系統硬體檢測,包括記憶體 系統匯流排檢測等,然後bios讀取啟動裝...

Linux核心啟動過程

linux核心啟動過程 第一篇日誌就摘錄一下linux核心的啟動過程,參考了 linux核心移植和yaffs2根檔案系統製作 嵌入式linux系統從軟體角度看可以分為四部分 引導引導程式 bootloader linux核心,檔案系統,應用程式。bootloader是系統啟動時執行的第一段 它主要用...

linux核心啟動過程

linux核心啟動過程完成啟動核心並執行使用者空間的init程序的功能。當核心映像被載入到ram之後,bootloader的控制權被釋放。核心映像並不是可直接 執行的目標 而是乙個壓縮過的zimage 小核心 或bzimage 大核心,bzimage中的 b 是 big 意思 但是,並非zimage...