Linux核心的啟動過程

2021-07-10 11:23:57 字數 2756 閱讀 5431

x86 cpu啟動的第乙個動作cs:eip=ffff:0000h(換算為實體地址為000ffff0h,因為16位cpu有20根位址線),即bios程式的位置。

bios例行程式檢測完硬體並完成相應的初始化之後就會尋找可引導介質,找到後把引導程式載入到指定記憶體區域後,就把控制權交給了引導程式。這裡一般是把硬碟的第乙個扇區mbr和活動分割槽的引導程式載入到記憶體(即載入bootloader),載入完整後把控制權交給bootloader。

引導程式bootloader開始負責作業系統初始化,然後起動作業系統。啟動作業系統時一般會指定kernel、initrd和root所在的分割槽和目錄,比如root (hd0,0),kernel (hd0,0)/bzimage root=/dev/ram init=/bin/ash,initrd (hd0,0)/myinitrd4m.img

核心啟動過程包括start_kernel之前和之後,之前全部是做初始化的彙編指令,之後開始c**的作業系統初始化,最後執行第乙個使用者態程序init。

而這次的實驗我們重點來說下init這個程序。

首先我們先來載入執行乙個簡易的核心系統,本次的實驗都是基於這個簡易核心的,

接下來便是通過gdb來跟蹤除錯核心,我試著用了兩個斷點來跟蹤核心執行,第一步是在核心啟動時凍結cpu

第二步就是使用gdb來進行跟蹤,通過(gdb)target remote:1234,建立起gdb與gdbserver之間的連線,再按c讓qemu上的linux繼續執行,

接下來我在start_kernel和rest_init處分別設定了乙個斷點來跟蹤核心的執行狀態:

以上便是我實驗做的內容。

接下來我們要分析的是從start_kernel到init程序啟動的具體過程

首先我們可以看到這個函式裡面有個全域性變數init_task,這個init_task即手工建立的pcb,是0號程序,也是最終的idle程序。接著讀程式,接下來就是對一些模組的初始化,讀到rest_init時,我們可以看到

從rest_init開始,linux開始產生程序。從上面這個函式我們可以看出,kernel_thread這個函式通過變數kernel_init和kthreadd又生成了1號和2號程序,由於之前通過init_task已經建立了0號程序,而在rest_init函式中,核心將通過下面的**產生第乙個真正的程序(pid=1):

static noinline void __init_refok rest_init(void)

kernel_init函式可以通過呼叫kernel_execve來執行根檔案系統下的/sbin/init檔案。而此時init_task的任務基本上已經完全結束了,它將淪落為乙個idle task,事實上在更早前的sched_init()函式中,通過init_idle(current, smp_processor_id())函式的呼叫就已經把init_task初始化成了乙個idle task,init_idle函式的第乙個引數current就是&init_task,在init_idle中將會把init_task加入到cpu的執行佇列中,這樣當執行佇列中沒有別的就緒程序時,init_task(也就是idle task)將會被呼叫,它的核心是乙個while(1)迴圈,在迴圈中它將會呼叫schedule函式以便在執行佇列中有新程序加入時切換到該新程序上。

這正好符合了道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三個程序),三生萬物(1號程序是所有使用者態程序的祖先,2號程序是所有核心執行緒的祖先),新核心的核心**已經優化的相當乾淨,都符合中國傳統文化精神了。

實驗總結:

對於整個實驗,我們可以清晰的看到核心是怎麼建立程序的,這跟道家的道生一(start_kernel....cpu_idle),一生二(kernel_init和kthreadd),二生三(即前面0、1和2三個程序),三生萬物(1號程序是所有使用者態程序的祖先,2號程序是所有核心執行緒的祖先)比較貼切,先是有start_kernel這個函式通過init_task建立了0號程序,再由函式kernel_thread通過變數kernel_init和kthreadd又生成了1號和2號程序,而1號程序是所有使用者態程序的祖先,2號程序是所有核心執行緒的祖先,繼而可以建立更多的程序了。

《linux核心分析》mooc課程

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