核心啟動前需要滿足的條件(暫存器,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...