2018-2019-1 20189204《Linux核心原理與分析》第四周作業
《庖丁解牛》第3章——MenuOS的構造
3.1Linux核心原始碼簡介
計算機三大法寶:儲存程式計算機、系統呼叫堆疊、中斷
作業系統兩把寶劍:中斷切換上下文、程序切換上下文
Linux核心原始碼的目錄結構
其中,arch目錄是與體系結構相關的子目錄列表,裡面存放了許多CPU體系結構的相關程式碼,使得Linux核心可以支援不同的CPU和體系結構(指令集)。我們重點關注x86目錄
init目錄存放核心啟動時的初始化程式碼,/init/main.c中的start_kernel是Linux核心啟動的起點。
3.2構造一個簡單的Linux核心
在“實驗樓”環境下構造MenuOS
根檔案系統一般包括記憶體根檔案系統和磁碟檔案系統。
initrd即 initial ramdisk,普通使用者一般感知不到這個記憶體根檔案系統的存在,因為核心啟動時先訪問initrd檔案系統(記憶體根檔案系統),然後在切換到磁碟檔案系統。圖為構建Linux系統MenuOS
3.3跟蹤除錯Linux核心的啟動過程
輸入命令qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd rootfs.img -S -s
,核心被凍結
在start_kernel()處設定斷點
在gdb模式下按c繼續
在rest_init()處設定斷點並繼續
3.4核心程式碼分析
start_kernel()
start_kernel()是核心啟動的起點,在此函式被呼叫前核心程式碼主要用於完成硬體系統初始化工作。在start_kernel()中幾乎完成了核心所有模組初始化工作。在這其中,最先生成的是0號程序(init_task)
init_task
init_task(pid=0),型別是tast_struct,使用巨集INIT_TASK進行初始化。
rest_init()
rest_init()新建kernel_init和kthreadd核心執行緒
405行用Kernel_thread執行kthreadd,建立PID=2的核心執行緒
實踐中學習到的其他知識
在自己的機器上搭建MenuOS的時候,第一步就是要先下載Linux核心原始碼。在下載快要完成的時候網路中斷,內心非常崩潰,又不甘心重新下載,因為網速實在是太慢了(微笑),所以我趕緊查了查wget的功能,想著還可以搶救一下。下圖是wget下載中斷後的樣子,在固定的時間長度下會自動傳送一個request並等待伺服器的response。
wget在預設情況下是不支援續傳的,如果下載的時候網路中斷,這時候再用wget不會續傳而是生成一個名為重複檔名1的檔案
那麼wget是否支援繼續傳輸呢?如何繼續傳輸?
老師說過只要想清楚問題就已經找到了答案
輸入wget -c 下載地址
就可以續傳之前下載中斷的檔案了,結果如圖所示
沒有解決的問題
1.compiler-gcc7.h找不到檔案或目錄
在自己的虛擬機器上安裝MenuOS的時候,遇到了這樣的問題
查詢linux-3.18.6的原始碼並沒有找到compiler-gcc7.h
在網上搜了一下也沒有找到compiler-gcc7.h,不知道大家有沒有好的解決方法。
2.init_task究竟是一個變數還是一個方法呢
在《庖丁解牛》中把init_task
寫成了一個方法,但是start_kernel()
中的程式碼是set_task_stack_end_magic(&init_task);