12

我知道,在启动时,BIOS 会在内存 0x7c00 上加载预定义设备驱动器的第一个扇区(512 字节),然后跳转到该地址。

因此,从 0x7c00 到 0x7dff 的内存被占用。是否有任何其他 RAM 部分被占用?

如果我正在编写操作系统,我可以将除 0x7c00 到 ox7dff 之外的所有 RAM 用于我自己的目的吗?或者,在启动时是否有任何其他部分充满了我不能覆盖的“宝贵”信息?

我知道在给定的时刻,我可以覆盖加载在内存上的 MBR(链式加载),我的问题集中在......内存的哪一部分可用于操作系统?

对不起,我的英语不好。谢谢你的回答!!

4

3 回答 3

9

x86 实模式内存映射如下:

 - 0x00000000 - 0x000003FF - Real Mode Interrupt Vector Table
 - 0x00000400 - 0x000004FF - BIOS Data Area
 - 0x00000500 - 0x00007BFF - Unused
 - 0x00007C00 - 0x00007DFF - Our Bootloader
 - 0x00007E00 - 0x0009FFFF - Unused
 - 0x000A0000 - 0x000BFFFF - Video RAM (VRAM) Memory
 - 0x000B0000 - 0x000B7777 - Monochrome Video Memory
 - 0x000B8000 - 0x000BFFFF - Color Video Memory
 - 0x000C0000 - 0x000C7FFF - Video ROM BIOS
 - 0x000C8000 - 0x000EFFFF - BIOS Shadow Area
 - 0x000F0000 - 0x000FFFFF - System BIOS

在我的实模式编程中,我通常坚持从 0x00007E00 - 0x0009FFFF(不是全部).. 我使用段:偏移寻址来使用内存.. 从 1 阶段引导加载程序到内核或引导加载程序第二阶段,我使用:

; bootloader.s

BITS  16
ORG   0x7C00

  CLI
  JMP 0xE000      ; Can also be JMP 0x7C00:200
  HLT

TIMES 510 - ($-$$) DB 0
DW 0xAA55

--

; Something.s

BITS  16
ORG   0x7E00      ; Can also be ORG   0x7C00:200

; Code goes here for your purposes.. whether it be a 2nd stage
; bootloader or your 16bit kernel..

CLI
HLT

如果您要进入保护模式,您仍然需要如上所示的存根。在Something.s中,您可以在保护模式例程中编程(GDT、A20、设置视频模式等)

为了解释 0x7C00(引导加载程序入口点)的内存位置,0x7C00 - 0x7DFF 是放置引导加载程序的位置(上面的 bootloader.s)。您将其放置在那里是因为 BIOS 在执行其例程后会跳转到该位置。引导加载程序的大小必须正好为 512 字节(注意 TIMES 指令)。从那里,您的代码可以是任何大小(只要它适合内存映射),您将能够完全在操作系统上工作。

如果您确实进入 32 位保护模式,您将能够使用任何关于 1MiB 标记的内容。

于 2011-09-04T18:26:47.093 回答
8

对于任何远程最近的 BIOS,您可以通过使用 BIOS Int 15/AX=E820h 调用来获取内存映射信息。这将告诉您可以用于操作系统的内存。

有关如何检测可用内存以及BIOS 内存映射内容的更详细说明,请参见OSDev

于 2009-06-27T03:04:46.113 回答
0

如果你编写一个操作系统,一旦你进入保护模式,你就会忘记 BIOS(除非你正在使用一些坏设备)并使用你所拥有的一切。

还是您正在编写引导加载程序?

于 2009-06-27T01:56:19.700 回答