1. 程式人生 > >20189229 張子松 第四周作業

20189229 張子松 第四周作業

文件夾 內核 簡介 bubuko 代碼 體系結構 構造 onf oot

本次寫博客之前,先看了看其他已經交了的同學的博客,頓時覺得自己對本章內容理解還不到位,於是又回去重新整理了一遍,將本章內容匯總如下:

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 張子松 第四周作業