關於計算機啓動流程的討論總結

bootsect.s  Grub stage1 MBR 512 覆蓋 分區表             2013-10-18 18:54:50          

分類: LINUX

http://blog.sina.com.cn/s/blog_6c9d65a10100mjas.html

linux清空mbr

在dos下可以用fdisk /mbr清一下mbr。在linux下可以用dd命令實現
mbr是512個字節,用0填充這個區域,這樣mbr原先的數據就沒有了。
dd if=/dev/zero  of=/dev/sda  bs=446 count=1
if 輸入文件 /dev/zero這是一個僞設備文件,實際上產生連續的null流,即二進制0流。
of 輸出文件 這裏指定一個硬盤
bs 塊的大小
count 複製塊的次數,表示有多少個塊,網上查說是可以這麼理解:bs表示一個扇區的大小,count表示有多少個扇區。
這表示前446個字節被0填充了,後66個存放分區表,如果也填充了,分區就沒有了。
這樣雖然清空了,但系統的loader也沒有了,所以機器也啓動不了了。
可以用fdisk /mbr (msdos)的命令把m$的bootloader寫入mbr的前446個字節內,m$的bootloader是根據分區的activity信息來決這下裝入哪個分區的。
也可以用linux的grub-install  /dev/sda 把自身的stage1內容寫入mbr的前446個字節內,但實際上grub很大,不可能全部放在446個字節裏,其它內容放在/boot/grub下面。

dd if=/dev/zero  of=/dev/sda  bs=512 count=1
這樣分區表也沒有了。




mbr:
mbr是主引導記錄,它記錄了整個硬盤的分區信息。格式化不能清除mbr
mbr在物理磁盤的0柱面,0磁道,1扇區,它由三部分組成,主引導程序,硬盤分區表,硬盤有效標誌(55AA)。
主引導程序佔用:446個字節。
分區表佔用:64字節,每個分區表項長16個字節,一共4個,所以最多4個主分區(包括擴展分區)

有效標誌:固定爲55AA,如果該標誌錯誤,系統不能啓動。


知道這些可以備份分區表:
dd if=/dev/sda  of=mbr.bak  bs=512 count=1

恢復分區表:
dd if=mbr.bak of=/dev/sda  bs=512  count=1

+++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
http://tech.ccidnet.com/art/302/20070821/1184789_1.html

關於Linux系統下Grub啓動流程的討論總結

全世界linuxer都知道grub是什麼東西,但對於MBR引導到grub再引導到具體操作系統的這個流程可能有不少朋友就比較迷糊了。這不,cu上一位朋友就發出了這樣一個求助貼:


假如現在一臺電腦上裝了WIN2000系統,那麼我現在在裝上LINUX系統和 GRUB,那麼假如把GRUB裝在主分區的話,GRUB直接引導  LINUX和WIN2000,我是可以理解的,因爲MBR中是GRUB的STAGE1(對不對呢?),MBR通過檢查DPT分區信息引導系統跳轉至DBR (活動分區),我這裏想問的活動分區是什麼時候設的呢?那麼裝GRUB到MBR裏,那原來MBR中的WIN的引導信息是怎麼處理的呢?是不是我們假如說裝 GRUB到MBR的時候,GRUB就把GRUB所在那個區設置爲了活動分區了呢?然後GRUB引導時候,MBR就找到那個活動分區找到所需要的文件,然後 繼續呢?假如說把GRUB裝到其他分區(非主引導區)的話,那是怎麼樣實現GRUB先啓動的呢?不是先MBR嗎?因爲裝到了其他分區,沒有改主引導區,因 此主引導區還是WIN2000的引導數據啊,怎麼會GRUB先啓動了呢?這是爲什麼呢?跟活動分區有關係沒有呢?我看資料上寫的是哪個系統啓動哪個系統就 是活動分區,可是那樣的話,似乎就解釋不通了啊,就是最最開始這個地方一直不懂,理不清楚。


下面就是cu各個玩家對這個問題分析討論的總結。


首先讓我們看看傳統的啓動流程:加載並運行Master Boot Record(MBR)主引導區內容(如lilo等)。然後掃描分區表,定位活動分區,並將活動分區上的引導扇區內容加載到內存中執行。


系統引導過程主要由以下幾個步驟組成(以硬盤啓動爲例)


1、 開機;

2、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;

3、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;

4、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其他介質;如果沒有其他啓動介質,則顯示 “No ROM BASIC” ,然後死機;

5、 跳轉到0000:7c00處執行MBR中的程序;

6、 MBR先將自己複製到0000:0600處,然後繼續執行;

7、 在主分區表中搜索標誌爲活動的分區。如果發現沒有活動分區或者不止一個活動分區,則停止;

8、 將活動分區的第一個扇區讀入內存地址0000:7c00處;

9、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 “Missing Operating System”,然後停止,或嘗試軟盤啓動;

10、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;

11、 啓動系統。


裝grub到邏輯分區,那麼就一定把grub裝入的邏輯分區設爲活動的。不過,這時候,grub接管了11步以後的動作:從stage 1.5讀出grub.conf。再由配置和用戶選擇決定下一步的引導行爲。


一般安裝grub都有兩種情況,對於安裝到MBR這種情況而言,GRUB直接覆蓋了原來 的MBR引導程序。這也是爲什麼要換回“原來的 windows的引導方式”,只要用dos引導fdisk  /mbr一下就可以的原因。爲什麼可以這樣做,請注意,1-11步中有兩個地方出現了0000:7c00。不管是dos boot sector還是nt loader它本身也是從0000:7c00運行的。其實ms當年開發分區管理的這個小程序相當於是在bios引導boot  sector中插進去的。grub因爲也是寫的從0000:7c00這個內存開始的子程序,那麼既可以被BIOS加載又可以被dos的MBR加載應該好理 解了吧。


開機自檢後,引導權交給了硬盤的MBR,此時grub就啓動了。由grub來引導 windows  /linux都可以。注意:linux不一定要安裝在活動分區,因爲引導程序在MBR!但是windows一定要安裝在活動分區(可引導的  windows),第二個windows可以不安裝在活動分區,但它的引導文件一定在活動分區。


大體順序是:


grub—->windows–>查找引導文件—引導加載—啓動windows

grub—->linux—>查找引導文件(/boot)–>引導加載—啓動linux


那麼,如果把grub安裝到了其它的分區上,不是MBR呢?這是grub所裝在的那個主 分區必須被設爲活動分區。因爲MBR(物理主引導分區)中其實並沒有  OS相關的引導程序的,通常MBR只是掃描並讀取隨後的分區表,找到相應的活動分區,讀取相應活動分區的第一個扇區的512字節程序並運行,該程序負責進 一步引導相應分區的相應系統。因此,大概的運行次序是

BIOS—>MBR—->GRUB—->菜單。


這樣,大體的真實流程就可以總結如下了:


1、 開機;

2、 BIOS加電自檢(POST——Power On Self Test),內存地址爲0fff:0000;

3、 將硬盤第一個扇區(0頭0道1扇區,也就是Boot Sector)讀入內存地址0000:7c00處;

4、 檢查(WORD)0000:7dfe是否等於0xaa55.若不等於則轉去嘗試其他介質;如果沒有其他啓動介質,則顯示 “No ROM BASIC” ,然後死機;

5、 跳轉到0000:7c00處執行MBR中的程序;

6、  MBR先將自己複製到0000:0600處,然後繼續執行;假如先裝XP後裝LINUX,並且LINUX沒有裝在MBR,那這個MBR中的數據還是WIN 寫的數據,它的作用都是下步中所說的作用,就是搜索主分區表中標誌爲活動的分區,那麼這個時候就必須把GRUB所在的主分區設置爲活動的分區,這個時候才 能正常的啓動GRUB,然後GRUB的STAGE1在調STAGE1.5和其他的,從而來引導整個系統。假如說先裝XP後裝LINUX,但是GRUB裝在 了MBR,那樣STAGE1直接調入內存,STAGE1在調STAGE1.5和STAGE2等,從而來引導系統。那這個時候是不需要將GRUB其他文件所 在的主分區設爲活動分區的,它直接調STAGE1.5等,然後再調STAGE2等,來識別文件系統,從而實現可多啓動。

7、 在主分區表中搜索標誌爲活動的分區。如果發現沒有活動分區或者不止一個活動分區,則停止;

8、 將活動分區的第一個扇區讀入內存地址0000:7c00處;

9、 檢查(WORD)0000:7dfe是否等於0xaa55,若不等於則顯示 “Missing Operating System”,然後停止,或嘗試軟盤啓動;

10、 跳轉到0000:7c00處繼續執行特定系統的啓動程序;

11、 啓動系統。


一點資料:


能正常工作的grub應該包括一下文件:stage1、stage2、*stage1_5、menu.lst。

其中stage1的大小一定是512字節,它要被安裝(也就是寫入)某個硬盤的主引導記錄,或者某個活動分區(這個分區要用fdisk標記成可啓動的)的啓動扇區。stage1的主要的也是唯一的作用就是找到你存放在硬盤上某個地方的stage2文件,來完成後續的工作。


stage2 文件可以存在在某個特定的文件系統中,比如你分了一個linux分區,在上面創建一個ext2文件系統,然後把這個文件拷貝到這個分區的某個目錄下。也可以把stage2直接存放在硬盤的某個位置,也就是未分區的某個地方。不過,好像沒有多少人會這麼做吧。


因爲stage1的容量有限(主引導記錄MBR和啓動扇區的大小隻能夠是512字節), 所以它對文件系統是無法識別的,那如果你把stage2存放 在  ext2或者fat格式的文件系統上,它如何來找到這個文件呢?這就要用到上面提到的那些stage1_5的文件了,它們負責解釋文件系統。你的  stage2放在什麼格式的文件系統上,就要調用對應的那個stage1_5文件。比如,你把stage2存放在ext2格式的文件系統上,就需要  e2fs_stage1_5;stage2存放在fat格式的文件系統上,就需要fat_stage1_5了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章