Преобразование виртуальной памяти uEFI в физическую

Я экспериментирую с 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, что, как я думал, означает сопоставление идентичности, но виртуальный и физический адреса не совпадают, так что это явно неправильно. Кто-нибудь может объяснить мне, как работает перевод? Как мне перейти от виртуального к физическому или наоборот?

Мое приложение печатает строку и собирает карту памяти, чтобы карта была собрана во время работы приложения. Затем приложение ждет ввода пользователя, я на это время приостановил виртуальную машину, поэтому физические адреса были найдены во время работы приложения.


person Without Me It Just Aweso    schedule 12.06.2015    source источник


Ответы (2)


Глядя на код EDK2, кажется, что VirtualStart всегда устанавливается равным нулю, пока не будет вызвана функция служб времени выполнения SetVirtualAddressMap.

person haggai_e    schedule 15.06.2015

Во время Boot Services UEFI и его приложения всегда работают с сопоставлением удостоверений. UEFI не выполняет преобразование адресов, но позволяет битам, которые остались резидентными, выполняться по виртуальному адресу, назначенному им внешним агентом.

После успешного вызова ExitBootServices() вы можете вызвать SetVirtualAddressMap(), чтобы повторно применить перемещения и сделать возможным запуск кода по заданному виртуальному адресу. Ожидаемый вариант использования для этого — предоставление служб времени выполнения в контексте операционной системы.

person unixsmurf    schedule 15.06.2015
comment
Тогда почему адрес, напечатанный в моем приложении, не совпадает с физическим адресом системы? - person Without Me It Just Aweso; 22.06.2015