Здравствуйте. Решил все же накатать маленькую статью про DLL, по просьбе админа, НО столкнулся с таким вопросом, как базовый адрес DLL.
Как известно DLL, дают два преимущества:
1. Разработка отдельным человеком, после чего этим (кодом) могут пользоваться другие. (разделение труда)
2. При использовании DLL мы экономим ОЗУ, ведь общий код загружается только один раз.
Мой опыт: Я разрабатываю драйвер для ядра (Linux) и пишу интерфейс по средствам so библиотеки. Другие люди пишут клиент-сервер, web-интерфейс, и другие приложения которые общаются с устройством через данную so библиотеку, которая как раз и работает напрямую с драйвером.
1. Получаем разделения труда. И так как все остальные приложения пользуются одной и той же библиотекой, экономим (должны вроде как) ОЗУ в размере = (размер dll (грубо))* (кол-во приложений использующих dll).
У каждой DLL есть так называемый базовый адрес, по которому она будет загружена в виртуальное адресное пространство приложения. Назовем его Dll_BaseAddr.
Если приложение загружает несколько dll, у которых базовые адреса одинаковые, то загрузчик, понимает, что вторую библиотеку нужно сместить, (сместить все адреса переменных и т.п.).
Вопрос: каким образом достигается экономия ОЗУ, ведь разные приложения могут загружать одну и туже dll, в различной последовательности?
То что делаются копии переменных, для каждого процесса понятно, вопрос именно про область кода.
Или Dll изначально загружаются в отдельную область виртуального пространства ядра, после чего происходить проброс адресов в про-во приложения?
Именно хочется понять, как происходит экономия ОЗУ за счет того, что область кода присутствует в одном экземпляре (должна вроде как), и может ли она проходить с отрицательным эффектом?
Может ли быть такая ситуация, что код dll, будет загружен несколько раз?