【问题标题】:x86 Assembly language and bootingx86 汇编语言和引导
【发布时间】:2015-04-05 14:08:51
【问题描述】:

此问题与 MIT 课程操作系统工程 (6.828) 有关。
在它的第一个实验室中引入了引导加载程序。它说引导加载程序必须驻留在可引导设备的第一个扇区中,对于硬盘来说是 512 字节。他们拥有的引导加载程序有两个源文件 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 部分被加载到内存中?

【问题讨论】:

  • 我没有看到你课程中使用的boot.S 文件。查看它的内容——它是否使用 BIOS 例程调用将 boot.out 的其余部分从磁盘读入内存?
  • 我认为 boot.out 是文件 boot.S 的二进制版本,它以 ELF 格式存储在内存中。所以你说的不应该是这样。
  • 可能汇编程序是引导扇区中的第一阶段,C 文件是第二阶段(内核加载程序)。在传统上大约 8k 的 BSD 上,这样可以匹配。

标签: assembly x86


【解决方案1】:

我认为如果您的 boot.out 文件是 elf 格式的,那么它不是 boot-loader 我认为它必须使用 grub boot-loader 引导。 第一个 GRUB:

GRUB 代表 GRand Unified Bootloader,是一个引导加载程序,也是 Multiboot 规范的参考实现。 GRUB 可以引导任何兼容 Multiboot 的操作系统(例如 Hurd 等),但它也可以引导一些不兼容 Multiboot 的操作系统,例如Windows,通过链加载功能,以及其他一些通过特殊支持,例如Linux。 mbchk 可用于确定文件是否符合 Multiboot。

正如以下文档中所说,它可以为你加载你的精灵,..内核:

GRUB 为您完成了尝试启动操作系统的所有复杂性。 GRUB 可以处理各种文件系统:从 Linux ext2fs(第二扩展文件系统)上的 MS-DOS FAT 系统到 BSD FFS,并且可以加载各种二进制格式的内核,包括“通用”ELF、FreeBSD a.out、平面二进制文件、和“通用”可执行文件(任何具有有效 Multiboot 标头的文件)。

和其他选项是: 首先将引导加载程序 512 的字节加载到内存中,然后根据需要加载其他部分。我认为 Linux 0.11 使用此选项进行加载和引导。你可以看到它的来源here

请注意,要使用第二种方式,您的内核必须是平面二进制格式

有关操作系统开发的更多信息和...请参阅OSDev.org

【讨论】:

    【解决方案2】:

    您的“boot.out”看起来像是在使用 Elf 文件格式。您需要一个平面二进制文件格式。这意味着您要么需要说服链接器使用平面二进制而不是 elf 作为输出,要么需要使用工具(例如“objcopy”)将 Elf 转换为平面二进制。

    注意 1:对于硬盘,磁盘的前 512 字节通常保留给 MBR 和分区表,引导加载程序进入分区的第一个扇区,而不是磁盘的第一个扇区。

    注意 2:在任何情况下,在引导加载程序的前 512 个字节中切换到保护模式都没有任何意义。

    【讨论】:

    • Brendan,分区磁盘的前 512 个字节 MBR。 MBR 的前 446 字节是引导代码,它作为从磁盘引导的第一阶段运行。分区表是 MBR 的一部分,从第 467 个字节开始。
    • @AlexD:通常(按照惯例)MBR 与任何操作系统的引导代码无关,是通用(操作系统中立)的东西。对于简单的情况,MBR 可以很简单(例如,找到活动分区和链式加载),而对于更复杂的情况(双启动),MBR 可能是一个花哨的东西,可以让用户选择要启动的操作系统。
    • ..当然,就像所有美好的事物一样,它会被不了解并想以牺牲他人为代价偷工减料的人毁掉
    猜你喜欢
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-06-23
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多