20189229 張子松 第四周作業
本次寫博客之前,先看了看其他已經交了的同學的博客,頓時覺得自己對本章內容理解還不到位,於是又回去重新整理了一遍,將本章內容匯總如下:
MenuOS的構造
基於Linux內核源代碼構造一個簡單的操作系統MenuOS。
Linux內核源代碼簡介
計算機的“3大法寶”
- 存儲程序計算機
- 函數調用堆棧
- 中斷
操作系統有“兩把寶劍”
- 中斷上下文:保存現場和恢復現場
- 進程上下文
Linux內核源碼的目錄結構
Linux內核源碼的目錄結構如下圖所示:
關鍵目錄簡介
- arch:與體系結構相關的子目錄列表,可以使Linux內核支持不同的CPU和體系結構。
- x86:在下載源代碼研究時,只需留下x86目錄中的內容,避免同一個函數存在多個目錄中。
- block:存放塊設備管理的代碼。
- crypto:存放常見的加密算法的C語言代碼。
- Documentation:存放一些文檔。
- drivers:驅動目錄。
- firmware:固件。
- fs:文件系統。
- include:頭文件目錄。
- 存放Linux內核啟動時的初始化代碼。
- main.c:源文件是整個Linux內核啟動的起點,其中的start_kernel函數是源文件的起點。
- ipc:IPC為進程間通信。
- kernel:存放Linux核心代碼。
- lib:公用的庫文件目錄,但與c語言下的庫函數不同,內核編程中不能用c語言標準庫函數,所以此lib目錄下庫函數就是用來替代那些標準庫函數的。
- mm:存放內存管理代碼。
net:存放與網絡相關代碼,如TCP/IP協議棧等。
構造一個簡單的Linux內核
在構建MenuOS系統時,我選擇使用自己的linux系統來構建。
下載內核源代碼
建立一個LinuxKernel文件夾,鍵入以下指令:
cd ~/LinuxKernel/
wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz
下載源代碼
xz -d linux-3.18.6.tar.xz
tar -xvf linux-3.18.6.tar
cd linux-3.18.6
make i386_defconfig
make
運行內核源代碼
!問題!
此處make時會出現找不到compiler-gcc6.h和compiler-gcc7.h文件的錯誤,查找資料即可發現,compiler-gcc6與compiler-gcc7內容基本相同,所以即可以下載下compiler-gcc6之後復制重命名為compiler-gcc7,再將其放入include/linux目錄下即可。
制作根文件系統鏡像
返回上級目錄,鍵入如下命令:
mkdir rootfs
創建目錄用於存放文件系統
git clone https://github.com/mengning/menu.git
從GitHub上克隆menu
cd menu
gcc -pthread -o init linktable.c menu.c test.c -m32 -static
cd ../rootfs
cp ../menu/init ./
將init復制到rootfs下,因為系統啟動時默認先啟動init
find . | cpio -o -Hnewc | gzip -9 > ../rootfs.img
把當前rootfs下的所有文件打包成一個鏡像文件
運行結果如圖:
init是第一個用戶態進程,是1號進程。把init復制到rootfs目錄下邊,使用cpio的方式把當前rootfs下的所有文件打包成一個鏡像文件,這時一個簡單的根文件系統的鏡像就制作好了。
重新配置Linux內核,使之攜帶調試信息
鍵入如下命令:
make menuconfig
kernel hacking
-> Compile-time checks and compiler options
[*]compile the kernel with debug info
make
!問題!
在make menuconfig
時找不到curses.h文件,通過鍵入命令sudo apt-get install libncurses5-dev
即可解決。
跟蹤調試Linux內核的啟動過程
20189229 張子松 第四周作業