В Process Monitor, если мы выбираем конкретный процесс, затем выбираем его свойство, в свойствах события на вкладке процесса отображается адрес для каждого отдельного файла библиотеки и к чему относятся эти адреса? Также адреса в стеке указывают на виртуальную или физическую память?
1 ответ
Все указанные адреса являются виртуальными. Это начальные адреса библиотек DLL или других сопоставленных файлов в виртуальном адресном пространстве процесса. Адреса, показанные на вкладке Stack, также являются виртуальными.
Вы можете увидеть похожую разбивку в Process Explorer - включите "представление DLL" в нижней панели. А также в VMmap, но более подробно. VMmap включает в себя адреса "разделов" в каждом исполняемом файле. Будет один раздел для кода, один для данных только для чтения, один для "ресурсов" и т.д., Плюс некоторая управляющая информация.
На самом деле для операционной системы виртуальной памяти на x86/x64 крайне сложно напрямую использовать физический адрес, то есть ссылаться на него. Как только система "становится виртуальной", то есть устанавливает бит "Paging enable" в CR0 - что происходит очень рано при загрузке - все адреса, заявленные работающим кодом (будь то ядро или пользовательский режим), интерпретируются ЦП как виртуальные адреса, и должны быть переведены (используя информацию из таблиц страниц) в физическую, прежде чем они будут представлены контроллеру памяти.
Код ядра в ОС, конечно, «управляет» физической памятью (например, назначая ее нуждающимся процессам) и управляет записями таблицы страниц и номерами физических страниц, но он не может напрямую «ссылаться» на память через физические адреса памяти.