使用BIOS int 0x15 / E820查看内存映射

问题描述 投票:0回答:1

我正在x86上进行一些裸机编程。我处于16位模式,并且使用qemu进行仿真...我使用int 0x15 / ax = 0xE820查看内存映射...使用qemu监视器(检查我编写映射的区域),我得到以下信息关于内存映射:

Start=0 Length= 0x9fc00 (type 1)
Start=0x9fc00 Length= 0x400 (type 2) 
Start=0xf0000 Length= 0x10000 (type 2)
Start=0x100000 Length= 0x7ee0000 (type 1)
Start=0x7fe0000 Length= 0x10000 (type 2)
Start=0xfffc0000 Length = 0x40000 (Type 2)

因此,不在此映射中的线段(例如0xA0000)属于MMIO吗?我知道BIOS等使用了类型2的内存区域。(Start = 0x9fc00长度= 0x400(类型2)是EDBA)当我写入这些区域时会发生什么?

注意:我没有类型3(ACPI),可能是因为我正在使用qemu。在实际硬件中,我很可能也应该获得类型3区域。那是RAM吗?

memory bios memory-management acpi x86
1个回答
0
投票

此BIOS调用在INT 15h, AX=E820h - Query System Address Map,在“假设和限制”部分中注明的地方:

  1. BIOS将返回描述基板内存和与该基板内存相邻的ISA或PCI内存的地址范围。
  2. BIOS将不会为PCI设备,ISA Option ROM和ISA即插即用卡的内存映射返回范围描述。这是因为操作系统具有可用来检测它们的机制。
  3. BIOS将返回芯片组定义的地址孔,保留设备不使用这些地址孔。
  4. 为基板内存映射的I / O设备(例如APIC)定义的地址范围将作为保留值返回。
  5. 所有出现的系统BIOS都将映射为保留。这包括1 MB以下,16 MB(如果有)和磁盘末尾的区域。地址空间(4个演出)。
  6. 将不报告标准PC地址范围。此处不会描述A0000到BFFFF物理位置的示例视频存储器功能。从E0000到EFFFF的范围是特定于基板的,将被报告为适合董事会。
  7. 所有较低的内存都报告为普通内存。操作系统有责任处理为特定用途保留的标准RAM位置使用例如:中断向量表(0:0)和BIOS数据区域(40:0)。

维基百科文章Detecting Memory (x86)在其部分中添加“ BIOS功能:INT 0x15,EAX = 0xE820”添加以下规则:

  • 获得列表后,可能需要:对列表进行排序,合并相同类型的相邻范围,更改任何重叠区域限制为最严格的类型,并更改所有无法识别的“类型”值键入2。
  • Type 3“ ACPI可回收”存储区域可以像正常的“可用RAM”区域一样使用,并与之结合使用,只要您完成操作即可使用存储在此处的ACPI表(即“已回收”)。
  • 分配物理内存时应避免的类型2、4、5(保留的,ACPI非易失性,不良)标记的区域。
  • 将未列出的区域视为类型2-保留。
  • 您的代码必须能够处理不在任何类型的“页面边界”上开始或结束的区域。

结论:在地图中找不到的范围是有效的,可能被视频等设备内存占用。

© www.soinside.com 2019 - 2024. All rights reserved.