1. 程式人生 > 其它 >第十一課:GRUB與vmlinuz的結構

第十一課:GRUB與vmlinuz的結構

在機器加電後, BIOS 會進行自檢,然後由 BIOS 載入引導裝置中的引導扇區。Linux系統下下,引導扇區通常是安裝 GRUB 的一小段程式。最後 GRUB 會載入Linux 的核心映像 vmlinuz:

1BIOS GRUB

Linux通常是從硬碟中啟動的,硬碟上第一個扇區(每個扇區 512 位元組空間),被稱為 MBR (主啟動記錄),其中包含有基本的 GRUB 啟動程式和分割槽表,安裝 GURB 時會自動寫入到這個扇區,當MBR BIOS 裝載到 0x7C00地址開始的記憶體空間後, BIOS 將控制權轉交給了 MBR 。核心原始碼自此開始:

流程如下:

1)眾所周知, CPU

只能執行記憶體中的程式,如果想要執行硬碟或 U 盤中的程式,通常將程式載入到 RAM 中。但是 RAM 在斷電後就沒法儲存資料了。所以硬體工程師在設計 CPU 時,硬性的規定在加電的瞬間,強制將 CS 暫存器的值設定為 0xF000IP 暫存器的值設定為 0xFFF0。在實體地址為 0xFFFF0處連線了一小塊 ROM 晶片, BIOS 被固化在其中。

2)現在, CS : IP 指向 0xFFFF0 這個位置,正是 BIOS 程式的入口地址, BIOS 正式開始啟動。

3)BIOS 一開始會初始化 CPU

4)接著檢查並初始化記憶體,將自己的一部分複製到記憶體,最後跳轉到記憶體中執行。

5)接下來 BIOS

列舉本地裝置進行初始化,並進行相關的檢查,檢查硬體是否損壞,這期間 BIOS 會呼叫其他裝置上的韌體程式。

6)當裝置初始化和檢查步驟完成之後, BIOS 會在記憶體中建立中斷表和中斷服務程式,這是啟動 Linux 至關重要的工作,因為 Linux 會用到它們。

具體操作為:BIOS 從記憶體地址(0x00000)開始用 1KB 的記憶體空間(0x00000 ~ 0x003FF)構建中斷表,在緊接著中斷表的位置,用 256KB 的記憶體空間構建 BIOS 資料區(0x00400 ~ 0x004FF),並在 0x0e05b 的地址載入了 8KB 大小的與中斷表對應的中斷服務程式。

2GRUB 是如何啟動的

MBR 中只有, 512 位元組,其中還有

64 位元組的分割槽表加 2 位元組的啟動標誌,剩下的 446 位元組空間無法裝下 GRUB 這種大型通用引導器。

於是, 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.binvmlinux.binlinux/arch/x86/boot/tools 目錄下的 build

build 只是一個 HOSTOS(正在使用的 Linux)下的應用程式,它的作用就是將 setup.binvmlinux.bin 兩個檔案拼接成一個 bzImage 檔案,如下圖所示:

至於 Makefile 如何形成這倆檔案,已經跟著課程看過了,沒有記錄必要,如果未來的自己看到這篇筆記,又不知道怎麼形成,回去看課程就好。

1.2實踐篇

1) linux 目錄下:make ARCH=x86_64

2)再執行 make install,就會產生 vmlinux 檔案

編譯太慢了,這裡不做記錄了,等我編譯完 linux 原始碼自然就能看到這個檔案。