Защо 0x00400000 по подразбиране е базов адрес за стартиране на EXE-файлове

4
47

В The Old New Thing се появи поредната интересна информация от областта на компютърните технологии. Въпросът е защо базовият адрес за изпълняване на DLL-файловете по подразбиране е 0x10000000, а за изпълнимите EXE-файлове този адрес е 0x00400000? Защо е избрано именно това значение за EXE и кое е особеното на 4-те MB памет?

Оказа се, че изборът на базов адрес е направен с цел минимизиране на вероятността, че модулите ще бъдат преместени от системата. Това означава, че трябва да се предотврати припокриването с други модули и с обекти, които могат да се появят по-късно. За изпълнимите файлове, избягването на конфликт с новите модули означава освобождаване на адресното пространство, което може да бъде запълнено от DLL-библиотеките. Тъй като самата ОС поставя DLL-файловете в старшите адреси, а базов адрес за несистемните DLL е 0x10000000, то базовият адрес за EXE трябва да бъде по-малък от 0x10000000 и колкото е по-малък, толкова повече място ще остане, преди да започнат конфликтите на изпълнимите файлове с библиотеките. Но колко точно по-нисък да бъде този адрес?

Връщаме се към Windows NT, при която изпълнимите файлове могат да имат базов адрес 0x00010000 и всъщност много програми за Windows NT са написани по този начин. Но в Windows 95 малките адреси за запълнени с най-разнообразни модули, а мениджърът на виртуалните машини в тази ОС показва първите 64 KB на физическата оперативна памет в първите 64 KB на виртуалната памет, за да се избягнат грешките допускани от процесора (точно по времето на Windows 95 се е налагало да се заобикалят много бъгове в CPU и фърмуера за тях). Допълнително, първият мегабайт на виртуалното адресно пространство се изобразява в логическото пространство на активната виртуална машина, поради изискванията на режима virtual-8086 на процесорите x86.

Windows 95, точно както и предишната Windows 3.1, стартира Windows в специална виртуална машина, известна като System VM. Ето защо, когато централния процесор работи с Windows-приложение, а не с DOS-програма, цялото адресно пространство на виртуалната машина се записва, за да не се налага да се изгражда отново. Дотук с първия мегабайт от адресното пространство.

За да може бързо да превключва между процесите, мениджърът на виртуалните машини в Windows 3.1 закръгля паметта на всяка виртуална машина до 4 MB – едно значение в таблицата със страниците. Поради това закръгляне, губим 3 MB от адресното пространство, но печелим бързо превключване между програмите, а и в сравнение с максималните 4 GB адресно пространство, загубата на 3 MB е по-малка от 0,1%.

Този начин за разпределяне на паметта е пренесен в  Windows 95, но с възможност за собствено адресно пространство за 32-битовите програми. И така най-младшият адрес, по който може да бъде зареден изпълним файл Windows 95 е 4 MB или 0x00400000.

В наши дни тази технология е запазена, а тъй като оптимизация на програмите за Windows 95 едва ли има особен смисъл, за EXE-файловете днес може да бъде избран друг базов адрес, от което също няма особена полза,  освен естетичното удоволствие от постигнатата хармония.

4
ДОБАВИ КОМЕНТАР

avatar
4 Коментари
0 Отговори на коментарите
0 Последователи
 
Коментарът с най-много реакции
Най-горещият коментар
  Абонирай се  
нови стари оценка
Извести ме за
annikoloff
annikoloff

Господин Десподов, не за първи път тук се цитира The Old New Thing, но нека поне го превеждате качествено. Не се опитвайте да преразказвате на български неща, които не разбирате напълно. Например „3 MB оперативна памет“ изобщо не са „3 MB адресно пространство“ (в оригинал „three megabytes of address space“).

annikoloff
annikoloff

Цитат: губим 3 MB от заделената памет Това отново не е вярно. Address space си е адресно пространство. Адресното пространство си е точно това – адреси. Една програма може да е заделила 1 MB памет, но тази памет не е задължително да е от адрес 0 до адрес 1048575 (1MB). Тя може да започва от произволен адрес (е, почти произволен), например да е между адреси от 4 MB до 5 MB. Но това е 1 MB заделена памет (тук може да навлезем в подробности е ли тя commited или не, но това е друга тема). В горния пример 4 MB… Виж още »