Визуальное программирование и MFC

       

Процессы и адресное пространство


Процессу выделяется свое "частное" 4-гигабайтное виртуальное адресное пространство (вообразите, что у компьютера оперативная память размером в сотни гигабайт и что каждый процесс получает свои 4 Гб). Программа может обращаться к любому байту в этом адресном пространстве, используя единственный 32-битный линейный адрес. При этом в адресном пространстве каждого процесса содержится множество самых разных элементов, в том числе:

  • образ ЕХЕ-файла программы;
  • все несистемные DLL, загруженные Вашей программой (включая DLL-модули MFC),
  • глобальные данные программы (доступные как по чтению и записи, так и только по чтению);
  • стек программы;
  • динамически выделяемая память, в том числе кучи Windows и библиотеки С периода выполнения;
  • файлы, спроецированные в память;
  • блоки памяти, совместно используемые несколькими процессами;
  • память, локальная для данного выполняемого потока;
  • особые системные блоки памяти, в том числе таблицы виртуальной памяти;
  • ядро и DLL-компоненты Windows.
  • Слова о том, что адресное пространство процесса — его частная собственность, слегка не верны. Верхние 2 Гб вовсе не являются таковой, и их содержимое — общее для всех процессов. А вот нижние 2 Гб по-настоящему закрыты, в частности, это относится к стеку, кучами глобальной памяти с доступом по чтению/записи. Однако, двух идентичных процессов были отдельные копии кода и данных только для чтения, то какой бы в том был смысл? И действительно, образ ЕХЕ-файла проецируется на адресное пространство каждого процесса по одному и тому же адресу — обычно начиная с 0х40000000. То же относится и к DLL-модулям, если есть возможность их загрузки по одному и тому же адресу для каждого процесса. Закрытая память процесса занимает нижние 2 Гб (от 0 до Ox7FFFFFFF), но младшие 4 Мб (64 Кб под Windows NT) не используются.

    Насколько все это надежно? Посторонний процесс практически не имеет возможности перезаписать стек, кучи или глобальную память другого процесса, поскольку эта память, расположенная в нижних 2 Гб виртуального адресного пространства, принадлежит только тому, второму процессу. Пространство, занятое ЕХЕ- и DLL-модулями, помечено как "только для чтения", поэтому в том, что они проецируются на несколько разных процессов, никакой проблемы нет. Однако со старшим гигабайтом адресного пространства дело обстоит хуже, так как сюда отображаются важные данные Windows, доступные по чтению и записи. Сбойная программа вполне может уничтожить расположенные в этой области системные таблицы. (В Windows NT такой проблемы нет, потому что верхние 2 Гб защищены от записи.) Существует также вероятность того, что один процесс испортит содержимое спроецированного в память файла, используемого другим процессом, поскольку файлы проецируются на область, разделяемую всеми процессами. (В Windows NT и это не проблема, так как файлы проецируются на адреса ниже 0x80000000 (в нижние 2 Гб)).



    Содержание раздела