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