Чтобы запустить ехе файл CreateProcess(…), где имя файла – это один из параметров.
1. Отыскивается ехе файл, вызванный функцией.
2. Создаётся объект ядра процесс.
3. Создаётся адресное пространство нового процесса размером 4Гб.
4. Выполнение проецируемого файла на адресное пространство процесса. В самом ехе файле указы-вается регион адресного пространства, в которое спроецирован файл.
5. Отмечается, что физическая память, связанная с выделенным регионом – это файл на диске, а не страничный файл.
6. Спроецировав ехе файл ОС читает несколько первых страниц в файл, чтобы получить список dll, необходимых данному ехе файлу. Затем ОС с помощью функции LoadLibrary(…) поочерёдно загружает указанные dll в адресное пространство процесса. Точно также выделяется регион в адресном пространстве и на него проецируется dll. Начальный адрес региона адресного простраства, на который желательно спроецировать dll указывается компоновщиком при создании dll. У всех системных dll (kernel32.dll и user32.dll).
7. После увязки ехе и dll файлов с адресным пространством процесса начинает выполняться стартовый код ехе файла. Подкачку страниц берёт на себя ОС.
Лекция № 8
Совместное использование статических данных
Например, имеется ехе файл, который состоит из
ехе файл виртуальная память ВАП
рис. 1.
Допустим загружен второй экземпляр этого же процесса. Информация о предоставляемой файлом страницы виртуальной памяти хранится в структурах, которые называются модули. Допустим процесс 1 изменяет данные на странице данных 2. Windows NT, Windows 2000 выделяет дополнительные страницы из страничного файла по мере необходимости, благодаря тому, что Windows NT, 2000 имеют такой атрибут страницы, как PAGE_WRITECOPY. В Windows 95, 98 такого атрибута нет. Поэтому Windows 95, 98 резервирует в страничный файл количество страниц, необходимых для размещения блока глобальных переменных, то есть реально используются, если программа изменяет глобальные переменные.
Можно выделить 4 уровня функций работы с памятью, причём функции последнего уровня зависят от функций предыдущего уровня.
1. Функции управления памятью на уровне системных сервисов – 0 кольцо. В Windows 95, 98 это VMM.vxd, в Windows NT, 2000 – это ntoskrnl.exe. Эти функции предназначены для выделения небольших областей памяти и манипулирования страницами этих областей, то есть единица выделения – это страница. Прикладные программы не имеют право вызывать эти функции.
2. VirtualXXX. Это функции управления виртуальной памятью, поддерживаемые kernel32. Эти функции поддерживает ядро. По функциональным возможностям аналогичны функциям 1 уровня. Эти функции могут использоваться приложениями пользователей.
3. Функции для работы с кучей. Функции Win32API, поддерживается kernel32, позволяют выделять в память из кучи минимальный блок - 4 байта. По смыслу совпадают с функциями языков програм-мирования.
HeapXXX, new, malloc. Примыкают функции LocalHeap и GlobalHeap (устаревшие – используются для совместности и выполняют одинаковые действия).
4. Функции для работы с памятью конкретных языков программирования.