■ Происхождение вопроса
Почему диапазон адресов 0xC0000000 ~ 0xFFFFFFFF всегда дает 0x00 или 0xFF после переключения в защищенный режим перед включением подкачки?
■ Наблюдаемое явление
- Все значения физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF печатаются 0x00, если они выполняются QEMU.
- Все значения физической памяти в диапазоне от 0xC0000000 до 0xFFFFFFFF печатаются в 0xFF, если они выполняются на реальном оборудовании посредством устаревшей загрузки.
■ Условия
■ Ответы на последний связанный вопрос
Адреса физической памяти в диапазоне от 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
■ Вопросы
- Правильно ли мое понимание?
- Что не так с кодом механизма настройки доступа?
- Есть ли какой-нибудь более простой способ проверить 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