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