logo
АВМиС - бывшее АПЭВМ / apvem / всякаявсячина

49.Адресное пространство nt

Раздел от 0x00000000 до 0x0000FFFF

Этот раздел (размером 64 Кб) в нижней части адресного пространства резервируется в Windows NT, чтобы программисты могли выявлять нулевые указатели — так же, как и в первых 4 Кб под управлением Windows 95. Любая попытка чтения или записи в память по этим адресам генерирует нарушение доступа.

Раздел от 0x00010000 до0x7FFEFFFF

В этом разделе размером 2 147 352 576 байтов (2 Гб за вычетом 64 Кб и еще 64 Кб) рас­полагается закрытое адресное пространство процесса. Этот раздел аналогичен разделу от 0x00400000 до Ox7FFFFFFF в Windows 95.

При загрузке Win32-пpoцeccy необходим доступ к системным DLL: KERNEL32.DLL, USER32.DLL, GDI32.DLL и ADVAPI32.DLL. Код этих и других DLL помещается именно сюда. Каждый процесс может загрузить их по любому адресу в пределах данного раздела. Кроме того, система отображает на этот раздел все проецируемые в память файлы, доступ­ные данному процессу.

Раздел от 0x7FFF0000 до 0x7FFFFFFF

Этот раздел (размером 64 Кб) аналогичен разделу от 0x00000000 до OxOOOOFFFF, т. е. он тоже недоступен и любая попытка обращения к нему генерирует нарушение доступа. Microsoft резервирует этот раздел специально, чтобы упростить внутреннюю реализацию операцион­ной системы. Вспомните: когда Вы передаете в Wm32-функцию адрес блока памяти и его размер, то она (функция), прежде чем приступить к работе, проверяет, действителен ли данный блок. Допустим, Вы написали код:

BYTE bBuf[70000]

DWORD dwNumBytesWritten ;

BOOL WriteProcessMemory(hProcess, Ox7FFEEE90 bBuf

sizeof(bBuf) &dwNumBytesWritten);

Так вот, в случае функций типа WriteProcessMemory область памяти, в которую пред­полагается запись, проверяется кодом, работающим в режиме ядра, — только он имеет право обращаться к памяти по адресам выше 0x80000000. Если по этому адресу есть память, вызов WnteProcessMemory, показанный выше, благополучно запишет данные в ту область памяти, которая по идее доступна только коду, работающему в режиме ядра. Чтобы предот­вратить это и в то же время ускорить проверку таких областей памяти, Microsoft предпочла заблокировать раздел от Ox7FFFOOOO до Ox7FFFFFFF, и поэтому любая попытка чтения или записи в данной области памяти всегда генерирует нарушение доступа.

Раздел от 0x80000000 до 0xFFFFFFFF

В этот раздел (размером 2 Гб) загружаются Windows NT Executive, ядро и драйверы устройств. В отличие от Windows 95 компоненты операционной системы Windows NT полностью защи­щены. При попытке обратиться по одному из этих адресов Ваш поток вызовет нарушение доступа, что приведет к появлению на экране соответствующего сообщения и к завершению всей программы. Подробнее о нарушении доступа и принципах его обработки см. главу 16. Вероятно, Вы сейчас подумали, что со стороны Windows NT весьма неразумно отби­рать у приложения целых 2 Гб адресного пространства, и я вынужден с Вами согласиться. Однако это сделано из-за процессора MIPS R4000, которому необходим данный диапазон адресов. Конечно, Microsoft могла бы реализовать Win32 для Windows NT на разных плат­формах по-разному, но решила (и, по-моему, вполне оправданно) упростить перенос при­ложений с платформы на платформу, зарезервировав эти 2 Гб во всех реализациях Win32 для Windows NT.