【发布时间】: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 上,这样可以匹配。