我知道,在启动时,BIOS会在内存0x7c00上加载预定义设备驱动器的第一个扇区(512字节),然后跳转到该地址。
因此,从0x7c00到0x7dff的内存被占用。是否还有其他RAM部分被占用?
如果我正在编程操作系统,我可以将除0x7c00之外的所有RAM用于ox7dff用于我自己的目的吗?或者,是否还有其他部分在启动时填充了“宝贵”信息,我不能覆盖?
我知道在给定的时刻,我可以覆盖内存中加载的MBR(链式加载),我的问题集中在......操作系统可用的内存部分是什么?
抱歉我的英语不好。谢谢你的回答!!
答案 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(除非您使用的是一些不良设备)并使用您拥有的所有操作系统。
或者您正在编写引导程序?