第十一課:GRUB與vmlinuz的結構
在機器加電後, BIOS 會進行自檢,然後由 BIOS 載入引導裝置中的引導扇區。Linux系統下下,引導扇區通常是安裝 GRUB 的一小段程式。最後 GRUB 會載入Linux 的核心映像 vmlinuz:
1BIOS 到 GRUB
Linux通常是從硬碟中啟動的,硬碟上第一個扇區(每個扇區 512 位元組空間),被稱為 MBR (主啟動記錄),其中包含有基本的 GRUB 啟動程式和分割槽表,安裝 GURB 時會自動寫入到這個扇區,當MBR 被 BIOS 裝載到 0x7C00地址開始的記憶體空間後, BIOS 將控制權轉交給了 MBR 。核心原始碼自此開始:
流程如下:
1)眾所周知, CPU
2)現在, CS : IP 指向 0xFFFF0 這個位置,正是 BIOS 程式的入口地址, BIOS 正式開始啟動。
3)BIOS 一開始會初始化 CPU
4)接著檢查並初始化記憶體,將自己的一部分複製到記憶體,最後跳轉到記憶體中執行。
5)接下來 BIOS
6)當裝置初始化和檢查步驟完成之後, BIOS 會在記憶體中建立中斷表和中斷服務程式,這是啟動 Linux 至關重要的工作,因為 Linux 會用到它們。
具體操作為:BIOS 從記憶體地址(0x00000)開始用 1KB 的記憶體空間(0x00000 ~ 0x003FF)構建中斷表,在緊接著中斷表的位置,用 256KB 的記憶體空間構建 BIOS 資料區(0x00400 ~ 0x004FF),並在 0x0e05b 的地址載入了 8KB 大小的與中斷表對應的中斷服務程式。
2GRUB 是如何啟動的
MBR 中只有, 512 位元組,其中還有
於是, GRUB 的載入分成了多個步驟,同時 GRUB 也分成了多個檔案,其中最重要的是 boot.img 和 corc.img 。如下圖所示:
其中, boot.img 被 GRUB 的安裝程式寫入到硬碟的MBR 中,同時在 boot.img 檔案中的一個位置寫入 core.img 檔案佔用的第一個扇區的扇區號。
core.img 檔案是由 GRUB 安裝程式根據安裝環境時的環境資訊,用其他 GRUB 的模組檔案動態生成。如下圖所示:
1)如果從硬碟啟動的話, core.img 中第一個扇區的內容就是 diskboot.img 檔案,diskboot.img 檔案的作用是讀取 core.img 中剩餘的部分到記憶體中。
2)由於這時 diskboot.img 檔案還不能識別檔案系統,所以將 core.img 檔案的全部位置以檔案塊列表的形式儲存到 diskboot.img 檔案中。以此確保 diskboot.img 檔案找到 core.img 檔案的剩餘內容。
3)將控制權交給 kernel.img 檔案
4)此時, core.img 檔案中嵌入了足夠多的功能模組,可以保證 GRUB 識別出硬碟分割槽上的檔案系統,能夠訪問 /boot/grub 目錄,並且可以載入相關的配置檔案和功能模組,來實現相關功能。
GRUB2 大量使用了動態載入功能模組,使得 core.img 檔案的體積變得足夠小。而 GRUB 的 core.img 檔案一旦開始工作,就可以載入 Linux 系統的 vmlinuz 核心檔案。
2.1詳解 vmlinuz 檔案結構
vmlinuz 檔案是由 bzImage 檔案複製而來的,由下面的程式碼可知生成 bzImage 檔案需要三個依賴檔案:setup.bin、vmlinux.bin,linux/arch/x86/boot/tools 目錄下的 build:
build 只是一個 HOSTOS(正在使用的 Linux)下的應用程式,它的作用就是將 setup.bin、vmlinux.bin 兩個檔案拼接成一個 bzImage 檔案,如下圖所示:
至於 Makefile 如何形成這倆檔案,已經跟著課程看過了,沒有記錄必要,如果未來的自己看到這篇筆記,又不知道怎麼形成,回去看課程就好。
1.2實踐篇
1)在 linux 目錄下:make ARCH=x86_64
2)再執行 make install,就會產生 vmlinux 檔案
編譯太慢了,這裡不做記錄了,等我編譯完 linux 原始碼自然就能看到這個檔案。