Если взять ваш пример менеджера виртуальной памяти, он фактически никогда не работает в пространстве пользователя. Чтобы выделить память, приложения пользовательского режима делают вызовы Win32 API (NTDLL.DLL
в качестве одного примера) для таких подпрограмм, как VirtualAlloc
.
Что касается перевода адресов, вот краткое описание того, как он работает (на основе содержимого Windows Internals 5th Edition ).
VMM использует таблицы страниц , которые ЦП использует для преобразования виртуальных адресов в физические адреса. Таблицы страниц живут в системном пространстве. Каждая таблица содержит много PTE ( записей таблицы страниц ), в которых хранится физический адрес, на который отображается виртуальный адрес. Я не буду вдаваться в подробности, но дело в том, что вся работа VMM выполняется в системном пространстве, а не в пользовательском.
Что касается переключения контекста - когда поток, выполняющийся в пространстве пользователя, должен выполняться в системном пространстве, произойдет переключение контекста. Поскольку диспетчер памяти находится в системном пространстве, его потокам никогда не требуется переключать контекст, поскольку он уже находится в системном пространстве.
Извиняюсь за упрощенное объяснение, это довольно сложная тема для глубокого обсуждения. Я настоятельно рекомендую вам взять копию Windows Internals , так как это может показаться вам полезным.