1. 程式人生 > >2018-2019-1 20189204《Linux核心原理與分析》第四周作業

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 下載地址 就可以續傳之前下載中斷的檔案了,結果如圖所示

更多wget的引數及用法

沒有解決的問題

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);