Hi Greg, Bill,
thanks for the detailed information.
Now I'm asking me why I did not ask you earlier because I have ~20 modules which then 
better be recompiled...
I assume that this also applies to Cygwin and perhaps OS2, or? If so then there's a 
common interest to have a BaseAddress2.ref for 3rd party modules; can we perhaps place 
it on a Apache server so that everyone has access to? I've already started with this 
and will now put in all modules I got compiled for Win32 and post it here if you 
agree...

thanks, Guenter.

> From: "Greg Stein" <[EMAIL PROTECTED]>
> Sent: Wednesday, October 03, 2001 4:09 AM


>> On Wed, Oct 03, 2001 at 09:56:40AM +0200, Guenter Knauf wrote:
>> > Hi Bill,
>> > can you please explain if every module really needs an entry in
>> > BaseAddress.ref? I tested with many modules without an entry and
> it seems to work with the linker defaults...
>> > If it is needed how should it be done then with 3rd party modules?
>>
>> Yes, it is needed. Without it, the linker will assign the same, fixed
>> address to every module. At runtime, those modules will then need to be
>> relocated to some address.
>>
>> Using BaseAddress.ref, we can effectively do the relocation at link time.
>> Sure, it is possible some other code is present and a relocation is
>> forced,
>> but that will be atypical.
>>
>> Relocation is expensive. Doing it at link time rather than load time is a
>> huge win.

> It's expensive in CPU at load time, but it's also expensive in memory.
> Each
> process that loads the .dll suddenly needs to keep a 'private' relocated
> copy
> of the code segment, even when all .dll's ended up at the same alt address
> :(

>> 3rd party modules can do whatever they want. Invariably, they will
>> probably
>> get relocated and/or clash with other 3rd party modules. But we *do* have
>> control over Apache itself and can help those.

> Easiest is to simply assign a random address somewhere between 0x20000000
> and
> 0x5F0000000.  You are very unlikely to ever clash with another module
> loaded
> between those addresses.  [Note these are segment aligned at 0x10000
> boundries.]

>> There are further optimizations with assigning addresses that we probably
>> don't do. Specifically, if there are "gaps" in the address space, then
>> you
>> end up wasting space in the processor's mapping tables. As a result, you
>> want to pack the modules as tightly as possible.
>>
>> Of course, that tight-packing is at odds with the optional loading of
>> modules. If we do the packing, then decide not to load something, then we
>> end up with a hole.
>>
>> [ and you can extend that to third party modules if we attempt to act as
>> a
>>   registry for them. it goes without saying that people won't have every
>>   third party module, so each apache process would have *huge* holes,
>>   thus
>>   wasting significant processor tables ]

> That's very common on Win32, and reasonably optimized because of it.  Com
> .dlls suffer the same problem, so it's been a priority for some time.


Reply via email to