Я экспериментирую с UEFI и не могу разобраться с виртуальной адресацией.
Я написал приложение uefi, содержащее строку «CatsAreAwesome». У меня приложение печатает виртуальный адрес этой строки. Это зависит от каждого исполнения, поэтому я буду придерживаться одного конкретного примера. Код выводит, что строка находится по виртуальному адресу 0x120ac3c0. Если я приостановлю виртуальную машину и просканирую файл vmem, я найду два экземпляра строки по адресу 0x1209e410 и 0x12ab000.
Из вызова getmemorymap в UEFI я обнаружил, что раздел памяти, в который попадают эти два,
TYPE PhysStart PhysEnd VirtStart VirtEnd
EfiConventionalMemory 1209C000 120A4000 0 8000
EfiLoaderCode 120A4000 120B1000 0 D000
Я не понимаю, как работает перевод. Виртуальное начало для этих двух разделов равно 0, что, как я думал, означает сопоставление идентичности, но виртуальный и физический адреса не совпадают, так что это явно неправильно. Кто-нибудь может объяснить мне, как работает перевод? Как мне перейти от виртуального к физическому или наоборот?
Мое приложение печатает строку и собирает карту памяти, чтобы карта была собрана во время работы приложения. Затем приложение ждет ввода пользователя, я на это время приостановил виртуальную машину, поэтому физические адреса были найдены во время работы приложения.