|
The
Facts
Every
executable and DLL module has a
preferred base address which
represents the “ideal” location
where the module should get
mapped to inside the process’s
address space.
Typically, when a programmer
builds a DLL module, the linker
sets the preferred base address
at 0x10000000. This can be
easily verified by using the
Visual Studio’s DumpBin utility
or Sysinternals’ Process
Explorer.
The
Problem
Figure 1
illustrates the problem. Let's
say you want to run an
executable that requires two
DLLs. The loader maps the first
DLL at its preferred base
address of 0x10000000. It then
attempts to map the second DLL
at the same preferred base
address of 0x10000000., but will
fail because the first DLL is
already mapped at this address.
As a remedy, the loader must
“relocate” the second DLL module
by placing it somewhere else
inside the process’s address
space. It must also perform the
necessary DLL code fix-ups.

Figure 1
– An example of a DLL collision
Relocating DLLs and performing
the necessary fix-up operations
is absolutely taxing on a
system. The loader has to
relocate hundreds of DLLs and
modify a significant portion of
each DLL’s code. This leads to
more memory consumption and
excessive copy-on-write
operations.
This run-time overhead can be
very damaging to the performance
of a system and must be avoided
at all costs. When multiplied by
the number of users on a
Terminal Server, this overhead
can have devastating
implications on performance and
application response times.
Next: Max-IT (VM) - The Solution

|