- •Введение
- •Связывание адресов
- •Общее описание виртуальной сегментно-страничной памяти ос Windows
- •Инструментальные средства наблюдения за работой менеджера памяти
- •Виртуальное адресное пространство процесса
- •Регионы в виртуальном адресном пространстве
- •Создание (резервирование) региона и передача ему физической памяти
- •Прогон программы выделения памяти при помощи функции Virtual Alloc
- •Прогон программы, демонстрирующей выделение больших массивов памяти
- •Регион куча
- •Прогон программы выделения памяти в стандартной куче
- •Регион стека потока. Сторожевые страницы
- •Прогон программы, моделирующей обращение к сторожевым страницам
- •Регион файла, отображаемого в память
- •Прогон программы, демонстрирующей отображение файла в память
- •Написание, компиляция и прогон программы, демонстрирующей различные аспекты проецирования файла в память
- •Заключение
Прогон программы, демонстрирующей отображение файла в память
#include <windows.h>
#include <stdio.h>
void main(void){
HANDLE hMapFile;
LPVOID lpMapAddress;
HANDLE hFile;
char * String;
hFile = CreateFile( "MyFile.txt", // имя файла
GENERIC_READ | GENERIC_WRITE, // режим доступа
FILE_SHARE_READ| FILE_SHARE_WRITE, // совместный доступ
NULL, // защита по умолчанию
CREATE_ALWAYS, // способ создания
FILE_ATTRIBUTE_NORMAL, // атрибуты файла
NULL); // файл атрибутов
if (hFile == INVALID_HANDLE_VALUE) printf("Could not open file\n");
hMapFile = CreateFileMapping(hFile, // описатель отображаемого файла
NULL, // атрибуты защиты по умолчанию
PAGE_READWRITE, // режим доступа
0, // старшее двойное слово размера буфера
20, // младшее двойное слово размера буфера
"MyFileObject"); // имя объекта
if (hMapFile == NULL) {
printf("Could not create file-mapping object.\n"); return;
}
lpMapAddress = MapViewOfFile(hMapFile, // описатель отображаемого файла
FILE_MAP_ALL_ACCESS, // режимы доступа
0, 0, // отображение файла с начала
0); // отображение целого файла
if (lpMapAddress == NULL) {
printf("Could not map view of file.\n"); return;
}
String = (char *)lpMapAddress;
sprintf(String, "Hello, world");
printf("%s\n", String);
if (!UnmapViewOfFile(lpMapAddress)) printf("Could not unmap view of file.\n");
}
Приведенная программа демонстрирует этапы создания файла, проецирования его в память, изменения его содержимого и отображения на диск.
Написание, компиляция и прогон программы, демонстрирующей различные аспекты проецирования файла в память
На основе предыдущей программы рекомендуется написать программу отображения файла в память с промежуточной выгрузкой файла на диск при помощи функции FlushViewOfFile. Рассмотрите различные варианты существования файла и его размеров до и после отображения.
Решение задачи совместного доступа к памяти будет приведено ниже.
Здесь мы временно прекратим изучение виртуальной памяти процесса. Основным итогом изложенного можно считать знакомство с возможностями ОС создавать в ней разнообразные регионы. В качестве самостоятельного упражнения можно рекомендовать анализ состояния виртуального адресного пространства при помощи функций VirtualQueryи VirtualQueryEx (см., например, [4]). Теперь перейдем к рассмотрению других аспектов функционирования менеджера памяти: структуре физической памяти и особенностям трансляции адреса.
Заключение
Система управления памятью является одной из наиболее важных в составе ОС. Традиционная схема предполагает связывание виртуального и физического адреса на стадии исполнения программы. Для управления виртуальным адресным пространством в нем принято организовывать сегменты (регионы), для описания которых используются структуры данных VAD (virtual address descriptors). Для создания региона и передачи ему физической памяти можно использовать функцию VirtualAlloc. Описана техника использования таких регионов, как куча процесса, стек потока и регион файла, отображаемого в память.
