这个问题与麻省理工学院课程操作系统工程(6.828)有关 在它的第一个实验室中引入了引导加载程序。它表示引导加载程序必须驻留在可引导设备的第一个扇区中,硬盘为512字节。他们拥有的boot-loader有两个源文件boot.S和main.c,它们组装成二进制boot.out 据我所知,这应该是存储在硬盘的第一个扇区(可引导扇区)中的二进制文件。但是当我使用linux命令" du -sh boot.out"检查它的大小,它是8kB。不应该是512字节 此外,他们还给出了boot.asm,它是boot.out(ELF格式)的.text部分的反汇编。此文件具有一系列汇编命令,其中包含存储它们的地址。该文件的一小部分如下所示:
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 :(得分:0)
我认为如果你的boot.out文件是elf格式的,那么它不是boot-loader我认为它必须用grub boot-loader启动。 第一个GRUB:
GRUB代表GRand Unified Bootloader,是一个引导加载程序和多引导规范的参考实现。 GRUB可以引导任何符合多重引导的操作系统(例如Hurd等),但是它也可以引导一些非多引导兼容的操作系统,例如, Windows,通过链加载功能,以及其他一些通过特殊支持,例如Linux操作系统。 mbchk可用于确定文件是否符合多重引导。
并且如下面的文档中所述,它可以为您加载您的elf,..内核:
GRUB通过为您执行操作来消除尝试启动操作系统的所有复杂性。 GRUB可以处理各种文件系统:从Linux-ext2fs(第二扩展文件系统)到BSD FFS的MS-DOS FAT系统,可以加载各种二进制格式的内核,包括&#34; generic&#34; ELF,FreeBSD a.out,平面二进制文件和&#34;泛型&#34;可执行文件(具有有效Multiboot标头的任何文件)。
和其他选项是: 首先将你的boot-loader 512的字节加载到内存中然后根据需要加载其他部分。我认为Linux 0.11使用此选项进行加载和引导。你可以看到它来源here
请注意,对于第二种方式的使用,您的内核必须采用平面二进制格式
有关os开发的更多信息,请参阅OSDev.org。
答案 1 :(得分:0)
你的&#34; boot.out&#34;看起来它使用的是Elf文件格式。您需要一个平面二进制文件格式。这意味着您需要说服链接器使用平面二进制而不是elf作为输出,或者您需要使用工具(例如&#34; objcopy&#34;)将Elf转换为平面二进制文件。
注1:对于硬盘,磁盘的前512个字节通常是为MBR和分区表保留的,引导加载程序位于分区的第一个扇区而不是磁盘的第一个扇区。
注2:在任何情况下,在引导加载程序的前512个字节中切换到保护模式都没有任何意义。