2015-06-12 9 views
1

Я делаю некоторые эксперименты с UEFI и не были в состоянии обернуть мою голову вокруг виртуальной адресации ..с UEFI Virtual для перевода физической памяти

Я написал заявление о UEFI, который содержит строку «CatsAreAwesome». У меня есть приложение для печати виртуального адреса этой строки. Он меняет каждое исполнение, поэтому я буду придерживаться одного конкретного примера. Код печатает, что строка находится на виртуальном адресе 0x120ac3c0. Если приостановить виртуальную машину и проверить файл VMEM я нахожу два экземпляра строки на адрес 0x1209e410 и 0x12ab000

От вызова getmemorymap в UEFI Я считаю, что раздел памяти те два падения являются

TYPE      PhysStart  PhysEnd  VirtStart  VirtEnd 
EfiConventionalMemory 1209C000  120A4000   0    8000 
EfiLoaderCode   120A4000  120B1000   0    D000 

I не понимают, как работает перевод. Виртуальный старт для этих двух разделов равен 0, что, я бы подумал, означало сопоставление идентичности, но виртуальные и физические адреса не выстраиваются в линию, так что это явно неверно. Может ли кто-нибудь объяснить мне, как работает перевод? Как мне перейти от виртуального к физическому или наоборот?

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

ответ

1

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

1

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

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

+1

Тогда почему адрес, напечатанный в моем приложении, не совпадает с физическим адресом системы? –