fbpx
-1.4 C
София

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

Най-четени

Даниел Десподовhttps://www.kaldata.com/
Ежедневен автор на новини. Увличам се от съвременни технологии, оръжие, информационна безопасност, спорт, наука и концепцията Internet of Things.

В 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-файловете днес може да бъде избран друг базов адрес, от което също няма особена полза,  освен естетичното удоволствие от постигнатата хармония.

Абонирай се
Извести ме за
guest
4 Коментара
стари
нови
Отзиви
Всички коментари

Нови ревюта

Подобни новини