2015-02-05 105 views
0

此問題與MIT課程操作系統工程(6.828)有關。
在其第一個實驗中引入了boot-loader。它表示,引導加載程序必須駐留在可引導設備的第一個扇區中,硬盤的這個扇區爲512字節。它們具有的boot-loader有兩個源文件boot.S和main.c,它們被組裝到二進制boot.out中。
據我所知,這應該是存儲在硬盤的第一個扇區(可引導扇區)中的二進制文件。但是當我使用linux命令「du -sh boot.out」來檢查它的大小時,結果是8kB。不應該是512字節。
此外,他們還給出了boot.asm,它是boot.out(ELF格式)的.text部分的反彙編。這個文件有一系列的彙編命令,它們的地址在它們的存儲位置。文件的一小部分如下所示:x86彙編語言和啓動

obj/boot/boot.out:  file format elf32-i386 


Disassembly of section .text: 

00007c00 <start>: 
.set CR0_PE_ON,  0x1   # protected mode enable flag 

.globl start 
start: 
.code16      # Assemble for 16-bit mode 
cli       # Disable interrupts 
7c00: fa      cli  
cld       # String operations increment 
7c01: fc      cld  

# Set up the important data segment registers (DS, ES, SS). 
xorw %ax,%ax    # Segment number zero 
7c02: 31 c0     xor %eax,%eax 

該文件包含512字節範圍內的地址。那麼爲什麼二進制boot.out佔用這麼多內存呢?是否只有ELF的.text部分被加載到內存中?

+0

我還沒有看到在你的課程中使用'boot.S'文件。看看它的內容 - 是否使用BIOS例程調用從磁盤讀入'boot.out'的其餘部分? – 2015-02-05 18:28:37

+0

我認爲boot.out是文件boot.S的二進制版本,它以ELF格式存儲在內存中。所以你說的不應該是這樣。 – sarthak 2015-02-05 18:56:05

+0

可能彙編程序是引導程序中的第一個階段,C文件是第二階段(內核加載程序)。在經典大約8K的BSD上,這樣匹配。 – 2015-02-05 21:04:34

回答

0

我想如果你的boot.out文件是elf格式的,所以它不是boot-loader我認爲它必須用grub boot-loader啓動。 首先GRUB:

GRUB代表大統一引導加載程序,並且是引導加載程序和多引導規範的參考實現。 GRUB可以啓動任何兼容Multiboot的操作系統(例如Hurd等),但它也可以啓動一些非Multiboot兼容的操作系統,例如, Windows,通過鏈式加載功能,還有一些通過特殊的支持,例如Linux操作系統。 mbchk可用於確定文件是否符合Multiboot。

和下面的文件可以加載你的小精靈說,..內核爲您提供:

GRUB帶走了所有的複雜性超出試圖這樣做是爲了你啓動你的操作系統。 GRUB可以處理各種文件系統:從Linux ext2fs(第二擴展文件系統)到BSD FFS的MS-DOS FAT系統,並且可以以各種二進制格式加載內核,包括「通用」ELF,FreeBSD a.out,平面二進制文件,和「通用」可執行文件(具有有效Multiboot標頭的任何文件)。

和其他選項是: 首先將你的boot-loader的512個字節加載到內存中,然後根據需要加載其他部分。我認爲Linux 0.11使用這個選項來加載和引導。你可以看到它的源here

請注意,使用第二種方法你的內核必須是平坦的二進制格式

更多信息OS開發和...查看OSDev.org

0

您的「boot.out」看起來像是使用Elf文件格式。您需要一個平面的二進制文件格式。這意味着你需要說服連接器使用平面二進制代替輸出的elf,或者你需要使用一個工具(例如「objcopy」)將Elf轉換爲平面二進制。

注意1:對於硬盤,磁盤的前512個字節通常是爲MBR和分區表保留的,而引導加載程序則位於分區的第一個扇區而不是磁盤的第一個扇區。

注2:在任何情況下,在引導加載程序的前512個字節中切換到保護模式都沒有任何意義。

+0

Brendan,分區磁盤*的前512個字節是* MBR。 MBR的前446個字節是作爲從磁盤引導的第一階段運行的引導程序代碼。分區表是MBR的一部分,從第467個字節開始。 – 2015-02-06 05:49:16

+0

@AlexD:一般來說(按照慣例),MBR與任何操作系統的啓動代碼無關,並且是一個通用(操作系統中立)的東西。對於簡單的情況,MBR可以很簡單(例如,找到活動分區和鏈式加載),對於更復雜的情況(雙啓動),MBR可能是一個讓用戶選擇要啓動的操作系統的奇特事情。 – Brendan 2015-02-07 19:03:56

+0

..當然,就像所有的好東西一樣,它被不明白並且想要犧牲他人爲代價的人們毀掉 – Brendan 2015-02-07 19:08:19