前些日子我裝機裝系統的時候,先裝了ubuntu,後裝了windows,導致最後ubuntu載入不起來,用easybcd引導系統也不盡如人意;後來接觸到了grub,覺得是個很神奇的東西,研究了一下。
最終對grub有了最深刻的認識是通過大神bean_lee的部落格,在此推薦給大家,
grub(grand unified bootloader)是乙個來自gnu專案的多作業系統啟動程式,它是乙個多重作業系統啟動管理器。用來引導不同系統,如windows,linux
既然它是乙個引導程式,我們來看下它所處的位置。(盜圖一張,m. tim jones在inside linux boot process中繪製)
grub的工作分為兩個階段,分別為圖中的stage1和stage2。但在實際應用中,其實還有第三個階段的存在:stage1.5,下文為你揭曉。
stage1、stage1.5和stage2其實也就是三個映象,依次被載入執行;那麼為什麼要分三個映象呢,做乙個映象就搞定豈不是簡單愉快?
這可能需要看一下bios的原始碼才能知道原委。
我沒有看過bios的源**,但是我推測一定是因為bios在最後會將mbr中的內容搬運到記憶體中執行,可是mbr只有512bytes空間,不夠放下所有的映象,所以要分成三個階段。
這裡要補充一下mbr的知識:
mbr,全稱為master boot record,即硬碟的主引導記錄。
為了便於理解,一般將mbr分為廣義和狹義兩種:廣義的mbr包含整個扇區(引導程式、分割槽表及分隔標識),也就是上面所說的主引導記錄;而狹義的mbr僅指引導程式而言。
硬碟的0柱面、0磁頭、1扇區稱為主引導扇區(也叫主引導記錄mbr)。它由三個部分組成,主引導程式、硬碟分割槽表dpt(disk partition table)和分割槽有效標誌。在總共512位元組的主引導扇區裡主引導程式(boot loader)佔446個位元組,第二部分是partition table區(分割槽表),即dpt,佔64個位元組,硬碟中分割槽有多少以及每一分區的大小都記在其中。第三部分是magic number,佔2個位元組,固定為0xaa55或0x55aa,這取決於處理器型別 ,如果是小端模式處理器 (如intel系列),則該值為0xaa55;如果是大端模式處理器 (如motorola6800),則該值為0x55aa。
所以放在mbr中的就是stage1了,bios將它搬運到0x7c00開始執行,那麼它會幹什麼的呢?
這段512個位元組**的作用是將0柱面,0磁軌,2扇區的512位元組copy到0x8000處執行預知詳情,請見該處
那放在0柱面,0磁軌,2扇區的自然就是stage1.5(準確的說是stage1.5的一部分)了,大小同樣也是512個位元組,它的存在是為了找到/boot/grub/stage2,而stage2存在檔案系統中;我們知道stage1階段是沒有os的,也沒有檔案系統的概念;識別檔案系統的工作就是stage1.5完成的。但是僅僅512bytes大小的程式是完不成對檔案系統的操作的,它只是乙個引子,作用是從lba 扇區號2(0柱面 0磁軌 3扇區) 開始拷貝若干個扇區到記憶體,後面的部分才是真正操作檔案系統的部分。
但是檔案系統千千萬,我們不可能把所有檔案系統的功能檔案放在磁碟的扇區裡面,那怎麼辦呢?grub 執行setup的時候,能夠識別啟動裝置的檔案系統,比如我們,是ext4檔案系統,所以只需要將ext4部分的e2fs_stage1_5放入扇區。
到這裡,stage1.5已經找到了stage2,stage2就可以開始載入作業系統了。
所以,最後再盜用一下總結:
1.mbr code 部分和/boot/grub/stage1部分一樣,這部分二進位制檔案是有grub源**中的/stage1/stage1.s彙編出的。所謂的stage1,作用只有乙個,就是將磁碟第二個扇區的內容載入的到記憶體
2.第二個扇區的內容和/boot/grub/e2fs_stage1_5檔案的前512位元組一樣,這部分內容是有grub 原始碼/stage2/start.s彙編出的,而這個start.s的作用就是載入磁碟的第三個扇區到第n個扇區到記憶體,n取幾,取決與檔案系統的支撐**的大小。
3.檔案系統支撐**到記憶體之後,我們在也不需要直接呼叫int 13載入扇區內容,我們有了檔案系統,我們可以直接操作檔案了。那麼/boot/grub/stage2這樣的比較大的檔案可以直接操作了。
grub使用筆記
grub分為grub lengrcy 和 grub2兩個版本.本人實踐確認了10.04和10.10兩個版本內建的是grub2 下面所提到的grub均指grub2.在開機時按 shift 可以進入grub選單.此時按 c 可進入grub的命令列模式 輸入 root h 按tab鍵可以列出可能的磁碟,補...
學習grub的一些體會
學習grub的一些體會 最近裝了很多次ubuntu系統,對於grub有了一些認識,今天就跟大家分享一下最近的學習。如果你有ubuntu和windows雙系統 最近都是在win7下裝ubuntu 並且想讓系統預設從windows啟動 首先你應該cd etc grub.d目錄下。該目錄下那些指令碼檔案的...
grub與grub2 的的區別
grub和grub 2 的區別在於 版本號不同,grub是指 grub1.97 和以前的,grub 2 指的是 grub1.98和以後的,現在已經發布grub2.00 了。一般還是把grub2 稱作grub。注意,目前我所知道的grub 2 一般用於linux下,windows下繼續使用古董 gru...