опубликован 14-02-2002 22:40 MSK
Всем привет. Пытаюсь разобраться с примером Рихтера по поводу создания глобальной переменной расшариваемой между всеми экземплярами приложения. Для этого в исполнимом файле создается дополнительная секция (.shared) с атрибутом RWS. DUMPBIN'ом Смотрим хедеры секций модуля - все нормально среди флагов секции действительно имеется Shared.Тут все понятно, но теперь рассмотрим фрагмент адресного пространство процесса с образом exe-шника:00400000 Image 102400 5 ERWC G:\VC\Richter\x86\17_AppInst.exe
00400000 Image 4096 -R-- ---
00401000 Image 73728 ER-- --- //.text
00413000 Image 4096 -R-- --- //.rdata
00414000 Image 12288 -RW- --- //.data,.idata,.shared
00417000 Image 8192 -R-- --- //.reloc
Так вот вопрос такой:по идее, страницы памяти где находятся обычные (не расшариваемые) данные должны быть с атрибутом PAGE_WRITECOPY а общие данные просто с PAGE_READWRITE, а здесь три секции .data ,.idata и наша .shared имеют одинаковый атрибут PAGE_READWRITE. Судя по таблице получается что секция импорта тоже шаровая! Но этого не может быть!!Т.е. вроде бы должно быть так:
00400000 Image 102400 5 ERWC G:\VC\Richter\x86\17_AppInst.exe
00400000 Image 4096 -R-- ---
00401000 Image 73728 ER-- --- //.text
00413000 Image 4096 -R-- --- //.rdata
00414000 Image 4096 -RWC --- //.data
00415000 Image 4096 -RWC --- //.idata
00416000 Image 4096 -RW- --- //.shared
00417000 Image 8192 -R-- --- //.reloc
Более того, если убрать атрибут Shared из шаровой секции то в памяти ничего не изменится >:|
Неужели наличие IMAGE_SCN_MEM_SHARED в заголовке секции никак не влияет на атрибуты cтраницы куда она отображается? Ведь для проецирования модулей винда использует обычный файл-маппинг - откуда такая мистика? Существует ли научное объяснение этих явлений ?