跟蹤分析Linux核心的啟動過程

2021-07-10 11:36:48 字數 2203 閱讀 1344

說明:在實驗樓裡做該實驗時,發現實驗樓環境老卡死,折騰幾個小時都如此,根本沒有辦法完成作業。因此此處只能提供一張截圖。後面的內容都是根據老師的課程整理出來的。

開啟shell:

使用gdb跟蹤除錯核心:

(gdb)file linux-3.18.6/vmlinux

說明:在gdb介面中targe remote之前載入符號表

(gdb)target remote:1234

說明:建立gdb和gdbserver之間的連線,按c 讓qemu上的linux繼續執行

(gdb)break start_kernel

說明:斷點的設定可以在target remote之前,也可以在之後

核心內部各程序的建立

linux-3.18.6**在:

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

基本所有模組,都需要start_kernel來進行初始化。

在init目錄下的main.c有函式

asmlinkage __visible void __init start_kernel(void)

其中,有init_task,set_task_stack_end_magic(&init_task);這個是手工建立的pcb,0號程序,即最終的idle程序。

trap_init();             //涉及中斷向量

mm_init();             //記憶體管理

sched_init();        //排程

rest_init();   -->kernel_thread(kernel_init, null, clone_fs);-->run_init_process(ramdisk_execute_command);          //init是第乙個使用者態程序,是1號程序

pid = kernel_thread(kthreadd, null, clone_fs | clone_files);                        //建立了執行緒

在rest_init中,各部分啟動完畢後,

/* call into cpu_idle with preempt disabled */

cpu_startup_entry(cpuhp_online);

呼叫static void cpu_idle_loop(void)

裡面有個while(1)

也就是在系統沒有程序需要執行時就排程idle程序

總結:在start_kernel啟動後,rest_init的中0號程序會一直存在。

linux核心中的init_task程序和idle程序,參考:

linux在無程序概念的情況下將一直從初始化部分的**執行到start_kernel,然後再到其最後乙個函式呼叫rest_init。

從rest_init開始,linux開始產生程序,因為init_task是靜態製造出來的,pid=0,它試圖將從最早的彙編**一直到start_kernel的執行都納入到init_task程序上下文中。在rest_init函式中,核心將通過下面的**產生第乙個真正的程序(pid=1):

完成各項任務之後,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函式以便在執行佇列中有新程序加入時切換到該新程序上。

邱在輝+原創作品+《linux核心分析》

mooc課程

頂 0 踩

跟蹤分析Linux核心的啟動過程

在linux作業系統中,系統的啟動都是從start kernel 這個函式開始的。start kernel 是核心的彙編與 語言的交接點,在該函式以前,核心的 都是用彙編寫的,完成一些最基本的初始化與環境設定工作,比如核心 載入記憶體並解壓縮 現在的核心一般都經過壓縮 cpu 的最基本初始化,為c ...

跟蹤分析Linux核心的啟動過程

1.除錯gdb 1 執行qemu 2 執行gdb並鏈結remote 3 設定斷點break start kernel,break rest init 2.分析start kernel 在斷點處停止 分析start kernel asmlinkage visible void init start k...

實驗三 跟蹤分析Linux核心的啟動過程

linux核心分析 mooc課程 一 linux核心原始碼 arch目錄下儲存有各個平台的源 fs檔案系統linux核心的原始碼放在kernel目錄中。原始碼的目錄結構如下圖所示 二 乙個簡單的linux系統menuos 三 使用gdb跟蹤除錯linux核心的方法 s freeze cpu at s...