歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> 淺析 GRUB 如何加載 Linux kernel

淺析 GRUB 如何加載 Linux kernel

日期:2017/2/28 14:22:58   编辑:Linux教程

前言

對於 GRUB 的加載流程,網上絕大部分都是寫對 menu.lst, grub.cfg 這些 GRUB 配置文件的編寫流程,就像是寫腳本語言一樣,用些關鍵字就能讓 PC機能正確啟動桌面 Linux 了。但這只是 GRUB 的使用,而不是GRUB的分析。

本來是沒有想要探究 GRUB 的想法,直到我在自制toy kernel 的學習中進入了 “虛擬內存管理”這一章節。很多介紹虛擬內存管理的時候都會說到 Linux 的內存管理,Linux 內核會加載到系統 3G~4G 的虛擬內存中, 但 GRUB 是沒有開啟虛擬內存的,Linux 內核的加載是被誰,又是如何加載相應段到 3G~4G 區的呢。

分析 kernel

vmLinux

我們看下內核源碼編譯後的最原始文件 vmLinux。該文件是 ELF 文件,使用 readelf 讀下該文件的 Section header.

這裡只截了幾個段顯示,後面的段都類似. 可以看到這些需要加載的段的地址的確是在 0xC0000000 之後。但 vmLinux 並不是可引導的Linux 內核文件。

Linux啟動的相關信息一般都在 `/boot` 下,我們看下裡面的內容.

可以看到 grub 文件夾,grub 就是引導 Linux 進行啟動的 bootloader,我們看下 `/boot/grub/grub.cfg` 文件的內容。


menuentry 'Linux Mint 17 {
recordfail
gfxmode $linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
linux /boot/vmlinuz-3.13.0-24-generic
initrd /boot/initrd.img-3.13.0-24-generic
}
帶有 linux 的一行就指定了啟動的內核,可以看到不是 vmlinux 文件,而是 vmlinuz 文件。


vmlinuz
搜索後可以看到 vmlinuz 是**可引導的,壓縮**的內核。 initrd 是"initial ramdisk" 的簡寫,是臨時的虛擬磁盤,暫時不討論。 因為我電腦上 vmlinuz 是64 bit的,對 64bit不太了解,所以找了個 32bit 的vmlinuz 文件來作解析。先試試`readelf`命令。

# readelf -S vmlinuz

readelf:錯誤: Unable to read in 0x7269 bytes of 節頭

readelf:錯誤: 不是 ELF 文件 - 它開頭的 magic 字節錯誤

不是 ELF 文件, 那試試 `objdump` 吧。

# objdump -afh vmlinuz

objdump: vmlinuz: 不可識別的文件格式
還是不行。

這個時候之所以會相當用這些命令看 vmlinuz 文件的段信息,因為在我的 toy kernel 中使用的是 ELF 文件,而且是使用 grub 加載的,對於 ELF 文件來說內部保護若干 section, 執行時這些 section 必須要在特地的內存地址上. 使用 `readelf` 查看toy kernel 的 section header 信息如下.

可以看到 Addr 段就是內核運行時這些段在內存中的地址。而加載我的內核的 grub 的配置如下

title toy kernel

root (fd0)

kernel /zkernel

module /initrd

vmlinuz 之所以叫做壓縮的內核,是因為它是使用 gzip 壓縮後得來,而且不單單是個純數據包,在文件開頭部分內嵌有 gzip 解壓縮代碼,相當於"自解壓"。我的內核需要由grub加載好相應的 section, 但 vmlinuz 都讀不出來段如何讓 grub 加載?

其實答案就在上面的 grub 配置文件裡,在 linux 中聲明內核使用的是 *linux* 關鍵字,在我的配置中聲明內核使用的卻是 *kernel*. 可以明確看出,grub對 linux 的加載是特殊對待的, 但具體怎麼特使對待,只能從源代碼裡看了。

如何在Ubuntu12.04/12.10中重裝或修復Grub2引導 http://www.linuxidc.com/Linux/2012-11/74901.htm

Linux啟動引導過程 grub和mbr http://www.linuxidc.com/Linux/2013-07/87923.htm

grub 的安裝與使用 http://www.linuxidc.com/Linux/2013-07/87682.htm

grub引導程序配置文件分析 http://www.linuxidc.com/Linux/2013-07/87547.htm

CentOS 6.4 grub加密碼 http://www.linuxidc.com/Linux/2013-07/87124.htm

CentOS GRUB引導錯誤無法進入系統解決辦法 http://www.linuxidc.com/Linux/2014-11/108835.htm

更多詳情見請繼續閱讀下一頁的精彩內容: http://www.linuxidc.com/Linux/2015-02/113021p2.htm

Copyright © Linux教程網 All Rights Reserved