我知道,在启动时,BIOS会在内存0x7c00上加载预定义设备驱动器的第一个扇区(512字节),然后跳转到该地址.
因此,从0x7c00到0x7dff的内存被占用.RAM中是否有其他部分被占用?
如果我正在编程操作系统,我可以使用除了0x7c00到ox7dff之外的所有RAM用于我自己的目的吗?或者,是否还有其他部分在启动时填充了"宝贵"信息,我不能覆盖?
我知道在给定的时刻,我可以覆盖内存中加载的MBR(链式加载),我的问题集中在......操作系统可用的内存部分是什么?
对不起,我的英语不好.谢谢你的回答!!
使用任何远程最近的BIOS,您可以使用BIOS Int 15/AX = E820h调用获取内存映射信息.这将告诉您可以为您的操作系统使用的内存.
有关如何检测可用内存的详细说明以及BIOS内存映射的内容可以在OSDev中找到.
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
Run Code Online (Sandbox Code Playgroud)
在我的实模式编程中,我通常坚持从0x00007E00 - 0x0009FFFF(不是全部)..我使用segment:offset寻址来使用内存..要从1阶段引导程序转到内核或Bootloader第二阶段,我使用:
; bootloader.s
BITS 16
ORG 0x7C00
CLI
JMP 0xE000 ; Can also be JMP 0x7C00:200
HLT
TIMES 510 - ($-$$) DB 0
DW 0xAA55
Run Code Online (Sandbox Code Playgroud)
-
; 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
Run Code Online (Sandbox Code Playgroud)
如果你进入保护模式,你仍然需要一个存根,如上所示..在Something.s中你可以在保护模式例程中编程(GDT,A20,设置视频模式等).
要解释0x7C00(引导加载程序入口点)的内存位置,0x7C00 - 0x7DFF是放置引导加载程序的位置(上面的bootloader.s).您将它放在那里是因为BIOS在执行其例程后跳转到该位置.引导加载程序的大小必须精确为512字节(请注意TIMES指令).从那里,您的代码可以是任何大小(只要它适合内存映射),您就可以完全使用操作系统.
如果您进入32位保护模式,您将可以使用任何有关1MiB标记的内容.
| 归档时间: |
|
| 查看次数: |
4210 次 |
| 最近记录: |