Adres bazowy programu

5

Czesc
Zastanawia mnie dlaczego w windowsie najczestszym adresem bazowym jest 0×400000? Z czego to wynika? I czemu nie moze to byc po prostu 0x0?

0

I czemu nie moze to byc po prostu 0x0?

Nie jestem do końca pewien, ale bodajże w którymś z YouTube-owych filmów Gynvael Coldwind mówił o tym, że alokowanie strony pod adresem 0x0 jest zakazane m.in.w Windowsie (ze względów bezpieczeństwa (null pointery)).

A odnośnie wczytywania programów pod adres 0x400000, to związane jest to z systemem stronicowania, w którym każda strona/ramka mapuje po 4 MB pamięci.
Adres 0x400000 to dziesiętnie 4194304 (bajtów); zamieniając na MB otrzymujemy: 4194304/1024/1024=4
Czyli wirtualny adres 0x400000 (który musi być wyrównany bodajże do 64 KB) tworzyłby pierwszą ramkę pamięci (biorąc pod uwagę, że nie można zmapować adresu 0x0), a ta ramka wskazywałaby na jakiś-tam obszar rzeczywisty zarezerwowany przez systemowy malloc/kmalloc/whateva.


*Ale to tylko moja teoria; sam nie wiem jak to dokładnie działa od środka i nie daję gwarancji na moje słowa ;)*
2

Szybki research wykonany przeze mnie i @Demonical Monka:

Odkrycie dokonane przez @Demonical Monka

In Windows 95, the address 0x10000 can't be used to load 32-bit EXEs because it lies within a linear address region shared by all processes. Because of this, Microsoft has changed the default base address for Win32 executables to 0x400000.

Odkrycie moje:

The Visual C++ linker uses a default base address of 0x00400000 because this is the lowest address an executable file image can load to when you run Windows 98. You can change the base address that your application loads to by using the /BASE: address linker switch for Microsoft's linker.

If you attempt to load an executable that has a base address below 0x00400000 on Windows 98, the Windows 98 loader must relocate the executable to a different address. This increases the loading time of the application, but at least the application can run. If you are developing an application that will run on both Windows 98 and Windows 2000, you should make sure that the application's base address is at 0x00400000 or above.

0

Dzieki za odpowiedzi ^^

1 użytkowników online, w tym zalogowanych: 0, gości: 1