核心啟動過程

來源:互聯網
上載者:User

標籤:linux核心

具體要求如下:

Grub的源碼分析:Grub如何支援多個系統和核心的啟動選擇(MultiBoot機制)。

一.GRUB 簡介(介紹主流的系統管理程式grub)

什麼是GRUB;
GNU GRUB 是一個多重作業系統啟動管理器。GNU GRUB 是由GRUB(GRand Unified Bootloader) 派生而來。GRUB 最初由Erich Stefan Boleyn 設計和應用;
“boot loader”是電腦啟動後第一個啟動並執行軟體。它負責載入一個作業系統的核心,並把控制權交給核心。核心則負責剩下的初始過程。
GRUB 一個很重要的特色就是靈活性;GRUB 可以識別檔案系統和二進位格式的核心,所以你可以載入任何作業系統,而不需要記錄核心在
磁碟上的物理位置。

二.GRUB 的現狀
目前 GRUB 分成 GRUB legacy 和 GRUB 2。版本號碼是 0.9x 以及之前的版本都稱為 GRUB Legacy ,從 1.x 開始的就稱為 GRUB 2。目前 
GRUB Legacy 已經停止開發了,只是出於一個 bug fix 的狀態,不再增加新的功能了,所有的開發都轉移到 GURB 2 之上了。 

三.GRUB 和 stage 檔案(grub1)檔案說明


GRUB 含有幾個 images 檔案,兩個基礎(必需的)stages 檔案(stage1和 stage2),可選的 stage(也稱為 stage1.5),和兩個網路引導的images 檔案
nxgrub 和 pxegrub)。stage1 是用於引導 GURB 的一個必須的映象檔案。通常它是被嵌入到 MBR。或者一個分區的開機磁區之中。因為 PC 的開機磁區是 
512 位元組,所以 stage1 也是 512 位元組。stage1 的作用就是從一個本地磁碟載入 stage 2 或者 stage 1.5 。因為大小的限制,stage1 對 stage2 或者 
stage 1.5 的位置進行編碼,也就是說,stage1 是無法識別檔案系統格式的。stage2 是 GRUB 的核心映象。它幾乎處理所有的事情(除了載入它自己),
通常可以把他放在檔案系統上,但不是必須的。一旦你執行了 grub-install 安裝了 boot loader ,stage1 檔案就不是必須的,可以把它移動到任意位置,因為它已經被嵌入到 MBR 或者 PBR 了。stage1和stage2 檔案一般位於 /boot/grub/ 目錄下,在這個目錄下還有很多 stage 1.5 的檔案,而且都是以檔案系統格式命名的。它們的目的是在 stage1 和 stage2之間搭建一個橋樑,也就是 stage 1 載入 stage 1.5, stage 1.5 載入 stage2。stage1 和 stage 1.5 的不同之處是 stage1 無法識別檔案系統,stage 1.5 可以。因為 Stage2 太大了,無法被嵌入到某個固定的地區,而 Stage1.5可以安裝在 MBR 之後的位置。

四.多重作業系統引導管理器及工作原理
系統啟動引導管理器,是在電腦啟動後啟動並執行第一個程式,他是用來負責載入、傳輸控制到作業系統的核心,一旦把核心掛載,系統引導管理器的任務就算完成退出,系統引導的其它部份,比如系統的初始化及啟動過程則完全由核心來控制完成;
在X86 架構的機器中,Linux、BSD 或其它Unix類的作業系統中GRUB、LILO 是大家最為常用,應該說是主流;

五.啟動過程

電腦啟動後,BIOS將尋找第一個可開機裝置(通常為硬碟),而後從MBR中載入啟動程式,然後把控制交給這段代碼。MBR位於硬碟的前512位元組內。

GRUB具有兩種不同的啟動方法。一個是直接載入一個作業系統,而另一個是鏈式載入另一個啟動載入器,它然後將真正載入一個作業系統。概括而言,前 者是更期望的,因為你不需要安裝或維護其它啟動載入器,並且GRUB足夠靈活,能從任意硬碟、分區載入一個作業系統。不過,後者有時也是需要的,因為 GRUB不是天然地支援所有現存的作業系統。

 

GRUB 第一版本

GRUB的步驟1包含在MBR中。由於受MBR的大小限制,步驟一所做的幾乎只是裝載GRUB的下一步驟(存放在硬碟的其它位置)。步驟1既可以直接裝載步驟2,也可以裝載步驟1.5:GRUB的步驟1.5包含在MBR後面的30KB中。步驟1.5載入步驟2。

當步驟2啟動後,它將呈現一個介面來讓使用者選擇啟動的作業系統。這步通常採用的是圖形菜單的形式,如果圖形方式不可用或者使用者需要更進階的控制,可以使用GRUB的命令列提示,通過它,使用者可以手工指定啟動參數。GRUB還可以設定逾時後自動從某一個核心啟動。

 

GRUB 第二版本

與GRUB 第一版相似的是,boot.img像步驟1一樣在MBR或在開機磁碟分割中,但是,它可以從任何LBA48地址的一個扇區中讀取,它(boot.img)將讀取core.img(產生於diskboot.img)的第一個扇區以用來後面讀取core.img的剩餘部分。core.img正常情況下跟步驟1.5儲存在同一地方並且有著同樣的問題,可是,當他被移動到一個檔案系統或一個純粹的分區時會比在步驟1.5移動或刪除引起更少的麻煩。 一旦完成讀取,core.img會讀取預設的設定檔和其他需要的模組。

 

當GRUB啟動後

一旦選擇了啟動選項,GRUB把選擇的核心載入記憶體並把控制交給核心。在此步驟中,對於Windows之類不支援多啟動標準的作業系統,GRUB也 可以通過鏈式啟動把控制傳給其它啟動器。在這種情況下,其它作業系統的啟動程式被GRUB儲存了下來;與核心不同,其它作業系統如同直接自MBR啟動。類 似Windows的啟動菜單,也許是另一個啟動管理器,它允許在多個不支援多啟動的作業系統中做進一步的選擇。(在已有Windows的系統上面,或者包 含多個Windows版本的系統上安裝現代的Linux而不修改原作業系統,即屬於這類情況。)

六.Grub如何支援多個系統

6.1如何使用GRUB直接啟動一個OS

多重啟動是GRUB支援的原有格式。出於方便的緣故,還有對Linux,FreeBSD,NetBSD及OpenBSD的支援。如果你希望啟動其它作業系統,你將要鏈式載入它們

運行命令列啟動

鏈式載入一個OS

不支援多重啟動,並且在GRUB中沒有特殊支援的作業系統(存在對Linux,FreeBSD,NetBSD及OpenBSD的特殊支援)必須被鏈式載入,這涉及載入另一個啟動載入器,然後在實模式中跳轉至它。

鏈式載入器命令用於這個目的。通常也需要載入某些GRUB模組來設定合適的根裝置。綜合起來,我們得到像這樣結論,對於在第一個硬碟的第一個分區上的一個Windows系統:

menuentry"Windows" {

insmod chain

insmod ntfs

set root=(hd0,1)

chainloader +1

}

在具有多個硬碟的系統上,可能要求一個額外的變通方案。

鏈式載入僅在PCBIOS及EFI平台上支援。

6.2GNU/Linux

從GRUB啟動GNU/Linux相對簡單,因為它有點類似於啟動一個多重啟動相容OS。

1.       設定 GRUB的根裝置為與GNU/Linux的相同。命令search --file --set /vmlinuz或類似的命令可能可協助你。

2.       使用命令linux載入核心:

grub> linux /vmlinuz root=/dev/sda1

如果你需要指定某些核心參數,只要把它們附加到命令上。例如,把‘acpi’設定到‘off’,要這樣做:

grub> linux /vmlinuz root=/dev/sda1 acpi=off

至於可用選項的完整資訊,參考Linux原始碼樹中的文檔。

在linux命令裡,GRUB使用32位協議。在這個協議中某些BIOS服務,象APM或EDD不可用。在這種情況下,你需要使用linux16:

grub> linux16 /vmlinuz root=/dev/sda1 acpi=off

3.       如果你使用一個initrd,在linux後執行命令initrd:

grub> initrd /initrd

如果你使用linux16,你需要使用initrd16:

grub> initrd16 /initrd

4.       最後,運行命令boot。

注意:如果你使用一個initrd,並向核心指定‘mem=’選項,使得它使用少於真實大小的記憶體,你將也要向GRUB指定相同的記憶體大小。為了使 GRUB知道這個大小,在載入核心之前,運行命令uppermem。

6.3 DOS/Windows

GRUB不能直接啟動DOS或Windows,因此你必須鏈式載入它們。不過,它們的啟動載入器有某些關鍵性的缺陷,因此僅鏈式載入它們可能不能工作。為了對付這個問題,GRUB為你提供了兩個協助函數。

如果你已經在第一個硬碟以外安裝了DOS(或Windows),你必須使用硬碟交換技術,因為OS只能從第一個硬啟動。GRUB所使用的變通方案是命令drivemap,象這樣:

drivemap -s (hd0) (hd1)

這在你的第一個及第二個硬碟間執行一個虛擬交換。

注意:僅當DOS(或Windows)使用BIOS來訪問交換硬碟時,這才起作用。如果OS為硬碟使用一個特殊的磁碟機,這可能不能工作。

如果你在硬碟上安裝了多個DOS或Windows,會引起另一個問題,因為如果有多個用於DOS/Windows的主要磁碟分割,會引起混淆。毫無疑問你應該避免這樣做,不過如果你想這樣做,有一個解決方案。使用分區隱藏/解隱藏技術。

如果GRUB隱藏了一個DOS(或Windows)分區,DOS(或Windows)將忽略 這個分區。如果GRUB解隱藏一個DOS(或Windows)分區,DOS(或Windows)將檢測到這個分區。這樣,如果你已經在第一個硬碟的第一、 第二分區上安裝了DOS(或Windows),並且希望從第一個分區上啟動,像下面那樣做:

parttool (hd0,1) hidden-

parttool (hd0,2) hidden+

set root=(hd0,1)

chainloader +1

parttool ${root} boot+

Boot

 

 

 



核心啟動過程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.