前言
本文基於linux-
4.0核心的啟動流程非常複雜.大概分為三個過程
//這個流程不是必須的
//如果核心映象沒有壓縮(vmlinux),就不需要解壓縮
//但如果壓縮了,可以讓bootloader解壓,然後也可以讓核心解壓,一般是核心自解壓
1.發生條件
核心為壓縮檔案,且bootloader 沒有解壓核心
2.上序
uboot將控制權交付核心
3.**位置
arch/arm/boot/compressed/head.s 中 的 start 標號
4.非易失性儲存器位置
如果是uimage,在flash中映象所在首位址+
0x40
如果是桌面發行版,bootloader 支援檔案系統,在 /boot/vmlinuz
5.易失性儲存器位置
如果是uimage,則在 entry point
6.入口符號
start標號
7.出口符號
arch/arm/kernel/head.s 中的 stext
8.功能
decompress_kernel
將控制權交給 arch/arm/kernel/head.s 中的 entry
(stext)
9.問題
什麼時候列印什麼東西到終端?
uncompressing linux.
.. done, booting the kernel // 此次列印不依賴 控制台的註冊
這時候核心已經啟動了,怎麼會再次解壓呢?
啟動的部分沒有解壓,啟動的部分是解壓**. arch/arm/kernel/head.s 及其他檔案被壓縮了
解壓之後將stext放到**?
todo
移植需要什麼 load address entry point 一定要和 tftp位址 bootm 位址 對應.
1.發生條件
這個過程是必須的
2.上序
核心解壓或者uboot控制權轉移
3.**位置
arch/arm/kernel/head.s
4.非易失性儲存器位置
如果是桌面發行版,bootloader 支援檔案系統,在 /boot/vmlinuz
5.易失性儲存器位置
todo
6.入口符號
arch/arm/kernel/head.s 中的 entry
(stext)
7.出口符號
start_kernel
8.功能
檢查cpu id / board id / bootargs 的 合法性
設定頁表,使能mmu
複製資料段,清bss端
呼叫 start_kernel 函式
9.移植需要注意什麼
1. 第一條**執行了嗎?怎麼驗證?
// 點燈法,注意點燈使用的暫存器不要和源**衝突
2. cpu id
3. board id
1.發生條件
必須2.上序
開發板相關**
3.**位置
init/main.c
4.入口符號
start_kernel
7.出口符號
run_init_process // 執行使用者程式 "/sbin/init"
5.執行流程
...setup_arch//板子相關
parse_early_param//處理 early param..
. setup_command_line
...parse_early_param
parse_args//處理console tag // 此時printk 列印的東西 在 test buf 中..
. console_init // 此時會呼叫 register_console 來註冊 console ,可能會在這裡列印出來之前 printk 列印的東西.
// 最終會呼叫 console_unlock 來列印
// 如果此時沒有列印出來,則一般會在 do_initcalls 列印出來
// console_initcall 註冊的函式會在 do_initcall_level (level=3) 的時候被呼叫,一般用來 register_console..
. rest_init
kernel_init //init核心執行緒建立
kernel_init_freeable
do_basic_setup // 建立裝置
driver_init // 初始化驅動架構
do_initcalls // 做 0-7 level 的初始化,這些初始化主要是裝置相關的初始化. 網路協議棧 在 level 5 初始化
prepare_namespace // 掛載根檔案系統(flash 上的 jffs2檔案系統)或者網路檔案系統
free_initmem // 最後一次列印核心log 就是在這裡
run_init_process // 執行 執行使用者程式 "/sbin/init"
6.功能
做初始化,將控制權交給使用者程式
注意:此時核心只是將一部分控制權交由使用者程式,不過核心掌握著絕對的控制權.
核心交付控制權後,會開始服務使用者,但又同時防止使用者對核心造成破壞.
7.下序
使用者程序
8.問題
1.核心是什麼?
1.在啟動之初,核心是初始化程式
2.在啟動之後,核心是 核心** 及 核心執行緒的集合
2.為什麼一開始是核心態?
arm晶元規定,reset 異常會將 cspr 改寫為 svc模式, 此模式 特權級 為 高特權級.
//高特權級就意味著核心態.
3.什麼時候走向使用者態?
run_init_process 呼叫 do_execve
4.移植需要注意什麼
u-boot bootargs 中的 "root="
"init="
prepare_namespace 中的掛載檔案系統使用到的驅動(網路驅動,塊驅動)
核心啟動流程
核心的初始化過程由start kernel函式開始,至第乙個使用者程序init結束,呼叫了一系列的初始化函式對所有的核心元件進行初始化。其中,start kernel rest init kernel init init post等4個函式構成了整個初始化過程的主線。start kernel函式 從...
linux 核心 核心啟動流程
cs是 段暫存器,ip是指令指標暫存器 相當於偏移位址 儲存的是 指令的位址。cs ip共同作用生成了 位址,具體演算法是cs左移4位 ip即是 位址。例如cs 0xf000,ip 0xfff0,則 位址為0xffff0.global globl 命令 global symbol global 使得...
linux核心啟動流程
linux核心啟動流程 計算機在啟動時都是先加電,然後進行硬體檢測並引導作業系統的初始化程式,然後作業系統的初始化程式程負責讀入系統核心並建產系統的執行環境.一這過程相對來說比較復而且與cpu體系結構相關,這裡我們通過linux並以i386的體系結構對這一過程進行較為詳細的說明.1 硬體檢測 當機器...