Как проверить "ЦЭГМБ" и "ТОЛУД"? - PullRequest
0 голосов
/ 11 июля 2019

■ Происхождение вопроса Почему диапазон адресов 0xC0000000 ~ 0xFFFFFFFF всегда дает 0x00 или 0xFF после переключения в защищенный режим перед включением подкачки?

■ Наблюдаемое явление

  • Все значения физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF печатаются 0x00, если они выполняются QEMU.
  • Все значения физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF печатаются в 0xFF, если они выполняются на реальном оборудовании посредством устаревшей загрузки.

■ Условия

  • Процессор: i7-8700K (8-е поколение)
  • RAM: 32,0 ГБ
  • Режим: защищенный режим

  • Пейджинг: не включен (переключен в защищенный режим с использованием cr0)

■ Ответы на последний связанный вопрос

  • Адреса физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF относятся к «PCI PCI Devices». Ответ дал "Михаил Петч". (в случае моего оборудования i7-8700K (8-го поколения))

  • Диапазон памяти для конфигурационного пространства PCIe находится в этой области (на реальном оборудовании; возможно, не в qemu). Точный диапазон адресов можно найти в таблице ACPI MCFG. Ответ дан "prl".

Благодаря "Michael Petch" и "prl" я некоторое время гуглил с данным ответом.

И вывод как ниже.

■ Понимание

  • Адреса физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF превышают «Диапазон основной памяти (= Видимый ЦП / Доступный диапазон)». (в случае моего оборудования i7-8700K (8-е поколение))
  • Диапазон ввода-вывода для карты памяти PCI - это «часть» диапазона памяти выше «Основного диапазона памяти». Диапазон памяти выше «Main Memory Range» также называется «PCI Hole».
  • Физический адрес памяти 0xC0000000 - это TSEG_BASE / TSEGMB (верхняя часть основной памяти SEGment Memory Base) или TOLUD (вершина малой полезной драм). (в случае моего оборудования i7-8700K (8-го поколения))

■ Попытка

  • Чтобы убедиться, что мое понимание верно, проверьте TSEGMB и TOLUD моего оборудования.
  • Поэтому я попытался проверить TSEGMB через механизм доступа к конфигурации (CAM), используя инструкцию по сборке "in" и "out" (NASM).
  • Установив шину, устройство, функцию, смещение регистра (= 0xB8 в соответствии с таблицей Intel 8-го поколения), я получил 0x00000000 в eax.

■ Код

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

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

PCI Hole Wiki

TSEG 1

TSEG 2

...