Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Виртуальное адресное пространство процесса Лекц...doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
309 Кб
Скачать
☆

Прогон программы, демонстрирующей отображение файла в память

#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. Описана техника использования таких регионов, как куча процесса, стек потока и регион файла, отображаемого в память.