Виртуальное адресное пространство windows

"Для DLL-библиотек вычисление смещения загрузки начинается с создаваемого при каждой начальной загрузке общесистемного значения, которое называется смещением образа… В отличие от значения для исполняемых образов, это значение вычисляется только один раз при начальной загрузке и используется во всей системе, чтобы DLL библиотеки могли оставаться для совместного использования в физической памяти и перемещаться только один раз. Если бы DLL библиотеки заново отображались по разным адресам внутри различных процессов, их код нельзя было бы использовать совместно. Загрузчику пришлось бы корректировать адресные ссылки для каждого процесса по разному, превращая таким образом то, что было совместно используемым кодом, предназначенным только для чтения, в закрытые адресные пространства. Каждому процессу, применяющую данную DLL библиотеку, пришлось бы иметь собственную закрытую копию DLL в физической памяти."

//
//
Вопрос:
Не совсем понял, почему у разных процессов не могут быть отличающиеся виртуальные адреса на одну и ту же DLL? Таблицы соответсвия виртуальных и физических страниц у каждого процесса же индивидуальные.

Такое может быть, когда программа изменяет образ DLL, и создаётся изменённая копия в другом месте DLL', а самый первый образ DLL не трогается, и другие программы так же будут иметь к нему доступ. И так может происходить много раз, к уже изменённому образу может обратиться другая программа загружая в своё адресное пространство - просто напросто проецирует общая область памяти в которой находиться уже изменённый DLL(тоже самое и с не изменённым)

Да таблицы свои у каждого процесса, но дело в том что внутри dll может быть код использующий абсолютную адресацию, если база dll изменится код будет работать уже неверно

Рожденный ползать летать не может

Добавить комментарий