如何检出“ TSEGMB”和“ TOLUD”?

时间:2019-07-11 07:30:12

标签: memory pci

■问题的由来 Why does address range 0xC0000000 ~ 0xFFFFFFFF always give 0x00 or 0xFF after switching to protected mode before enabling paging?

■观察到的现象

  • 如果由QEMU执行,则将所有0xC0000000到0xFFFFFFFF的物理内存值打印为0x00。
  • 如果由真正的硬件通过旧版引导执行,则打印范围为0xC0000000到0xFFFFFFFF的所有物理内存值。

■条件

  • CPU:i7-8700K(第8代)
  • RAM:32.0GB
  • 模式:保护模式

  • 分页:未启用(使用cr0切换到保护模式)

■上一个相关问题给出的答案

  • 范围从0xC0000000到0xFFFFFFFF的物理内存地址与“内存映射的PCI设备”相关。答案由“ Michael Petch”给出。 (如果我的硬件是i7-8700K(第8代))

  • PCIe配置空间的内存范围在该区域(在实际硬件上;可能不在qemu中)。可以在ACPI MCFG表中找到确切的地址范围。答案由“ prl”给出。

多亏了“ Michael Petch”和“ prl”,我已经在谷歌上搜索了一段时间了。

结论如下。

■理解力

  • 从0xC0000000到0xFFFFFFFF的物理内存地址高于“主内存范围(= CPU可见/可访问范围)”。 (如果我的硬件是i7-8700K(第8代))
  • PCI内存映射的I / O范围是“主内存范围”之上的内存范围的“一部分”。高于“主内存范围”的内存范围也称为“ PCI孔”。
  • 物理内存地址0xC0000000是TSEG_BASE / TSEGMB(主内存SEGment内存库的顶部)或TOLUD(低可用Dram的TOp)。 (如果我的硬件是i7-8700K(第8代))

■尝试

  • 为确保我的理解正确,请检查硬件的TSEGMB和TOLUD。
  • 因此,我尝试使用“ in”和“ out”汇编指令(NASM)通过配置访问机制(CAM)检出TSEGMB。
  • 通过设置总线,设备,功能,寄存器偏移(根据Intel第8代数据表,该值= 0xB8),我已收到estrong中的 0x00000000

■代码

mov     ax, 8000h
or      al, byte 0x00
shl     eax, 16

mov     ax, word 0x0000
shl     ax, 11
mov     al, byte 0x00
or      ah, al
mov     al, byte 0xB8

cli
mov     dx, 0CF8h
out     dx, eax

mov     dx, 0CFCh
in      eax, dx
sti

■问题

  1. 我的理解正确吗?
  2. 配置访问机制代码有什么问题?
  3. 有没有更简单的方法来检出TSEGMB和TOLUD? (类似于设备管理器或FirmwareTablesView。)

■参考

Intel Main Memory Address Range

https://resources.infosecinstitute.com/system-address-map-initialization-in-x86x64-architecture-part-1-pci-based-systems/#gref

PCI Hole Wiki

TSEG 1

TSEG 2

0 个答案:

没有答案