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

12 boot mbr bios

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

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

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

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

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

bdo*_*lan 8

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

有关如何检测可用内存的详细说明以及BIOS内存映射的内容可以在OSDev中找到.


Adr*_*ado 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
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标记的内容.


J-1*_*DiZ 0

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

或者你正在写一个引导加载程序?