看了很多資料都很片段,在此整理成我認為合理的解釋。
首先BIOS 會去硬碟起始512 bytes 稱為MBR ( master boot record)。然後把它放在記憶體000:07c0 然後去執行它。
MBR 的前446 bytes 是code 。接著64 bytes 是partition table ,最後2bytes 是 magic number 0xAA55。
partition table 由 4 個 entry 組成,每個是16 bytes 。
其內容主要是此partition 起初 CHS ,結束CHS,另外也有 LBA starting sector ,及size,還有 partition 的 type ,type
用來表達是何種file system ,也可以用來表示此partition 是extended partition。還有一個值是用來表示此partition entry 是
active 或 inactive ,4 個partition 只會有其中一個是active 。
Question : active / inactive 的意義是?
Answer : 個人猜測是 active 的話,partition 中有OS, inactive 就只是一般的儲存裝置。另外 active partition 的 boot sector
會有內容,inactive partition boot sector 不會用到,也不會有內容。這裡的內容表示有code 可以執行。
認識CHS
要讀取硬碟的資料,使用的是BIOS 提供的INT 13 ,需要輸入參數 CHS , 也就是cylinder , head ,sectors。
上面的圖片說明了cylinder , track , sector 。好,那head 是什麼(以下為猜測)?一個platter 有 2 sides , 每側都
可以放資料,也就是一個platter 會有2個head ,現在我們想要讀某個sector ( 固定為512 bytes ) , 首先指出是哪個cylinder,
一個cylinder 會有很多個track ,例如上面的綠色區塊,有 4 個track , 可以利用 head 去說明指定track ,例如head 3 表示讀
第2個platter 的上半邊的track ,接下來指出是track 的哪一個sector 。
code 的主要工作是
(1)它自己從0000:07c0 搬到 0000:0600
(2)去讀 active partition ,然後將它partition 的前 512 bytes ( boot sector )讀出來,放在0000:07c0 ,然後去執行它。
這時MBR 工作就結束了,換成partition 的 boot sector 掌控。
boot sector 的就是去load kernel。
但問題是 kernel 放在哪裡? 先想一下partition ,
partition 已經formatted 好了,它可能是 ext2 , ...。所以會有root '/' ,那麼只要先規定好,把要讀的kernel 放在 /boot 下,
比如稱為 kernel.img好了,它放在 /boot/kernel.img。
boot sector 要有能力知道去解讀這個partition 的file system 。假設是ext2 好了。
ext2 的相關參數是放在superblock裡,superblock offset 一定是1024 , length 是1024。
boot sector 若要找到/boot/kernel.img ,首先要
找到root directory 的位置,這很簡單, inode = 2 是root inode ,然後在此inode 的data block 去找directory entry boot ,
然後找到kernel.img 的inode 。找到之後,將它load 到某某memory location (哪裡我不清楚), 然後去執行它。
Question: boot sector 和 MBR 有差嗎?
Answer :個人清測是MBR 指的是硬碟前512 bytes ,boot sector 是partition 前512 bytes ,它們的格式是一樣的,magic number 也一樣。
注意boot sector 和 MBR 都是 plain binary ,不像一般的application 可能是ELF。
因為boot sector 的code 只有446 bytes ,如果想讓boot sector 添加新的功能,boot sector 就要去load 其它有此功能的檔案,可以放在某個特
定的地方,例如: /boot/ 下。
