我知道,启动时,BIOS 会在内存 0x7c00 上加载预定义设备驱动器的第一个扇区(512 字节),然后跳转到该地址。
因此,0x7c00 到 0x7dff 的内存被占用。 RAM 是否还有其他部分被占用?
如果我正在编写操作系统,我可以将除 0x7c00 到 ox7dff 之外的所有 RAM 用于我自己的目的吗?或者,是否有其他部分在启动时填充了我不能覆盖的“宝贵”信息?
我知道在给定时刻,我可以覆盖内存上加载的 MBR(链式加载),我的问题集中在...内存的哪一部分可用于操作系统?
对不起,我的英语不好。感谢您的回答!
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 (不是全部)..我使用段:偏移寻址来使用内存。.要从第一阶段引导加载程序到内核或引导加载程序第二阶段,我使用:
; 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 标记的任何内容。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)