x86汇编语言和引导

时间:2015-02-05 16:10:57

标签: assembly x86

这个问题与麻省理工学院课程操作系统工程(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部分被加载到内存中了吗?

2 个答案:

答案 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个字节中切换到保护模式都没有任何意义。