BIOS加载到RAM中的哪些信息?

时间:2009-06-27 01:51:13

标签: boot bios mbr

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

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

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

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

抱歉我的英语不好。谢谢你的回答!!

3 个答案:

答案 0 :(得分:8)

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(并非全部)..我使用segment:offset寻址来使用内存..从1阶段引导加载程序转到内核或引导加载程序第2阶段,我用:

; 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(Bootloader入口点)的内存位置,0x7C00 - 0x7DFF是放置引导加载程序的位置(上面的bootloader.s)。您将它放在那里是因为BIOS在执行其例程后跳转到该位置。引导加载程序的大小必须精确为512字节(请注意TIMES指令)。从那里,您的代码可以是任何大小(只要它适合内存映射),您就可以完全使用操作系统。

如果你进入32Bit保护模式,你将可以使用任何关于1MiB标记。

答案 1 :(得分:7)

使用任何远程BIOS,您可以使用BIOS Int 15/AX=E820h call获取内存映射信息。这将告诉您可以为您的操作系统使用的内存。

有关如何detect available memory以及BIOS memory map内容的更详细说明,请访问OSDev

答案 2 :(得分:0)

如果您编写操作系统,一旦进入保护模式,您就会忘记BIOS(除非您使用的是一些不良设备)并使用您拥有的所有操作系统。

或者您正在编写引导程序?