Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 40076.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
392.19 Кб
Скачать

Лабораторная работа № 3 управление памятью. Регистровая память

Цель работы:

  • Закрепление понятия регистров как основных элементов процессора.

  • Составление программы.

  • Подготовка к выполнению курсовой работы.

Теоретическая часть по данной теме находится в папке преподавателя в программно-методическом комплексе в каталоге: «ПMK-СистемноеПО», файл для запуска ПМК – приложение pmk_sistemnoe.exe.

Задание. Разработать программу-тренажер по работе регистров флагов EFLAGS регистровой памяти.

Ход выполнения работы:

  1. Прочитать теоретическую часть по теме «Регистровая память».

  2. Разработать интерфейс программы, в котором будут наглядно представлены «Младшее слово» и «Старшее слово».

  3. Организовать режим работы для помощи пользователю в изучении флагов управления и флагов условий (отдельная форма).

  4. Организовать режим работы для проверки теоретического материала по вариантам (отдельная форма).

ЛАБОРАТОРНАЯ РАБОТА № 4

ВИРТУАЛЬНАЯ ПАМЯТЬ. ПРОЕЦИРУЕМЫЕ В ПАМЯТЬ ФАЙЛЫ – ОДИН ИЗ МЕТОДОВ

ОРГАНИЗАЦИИ ОБМЕНА ДАННЫМИ МЕЖДУ ПРИЛОЖЕНИЯМИ

Теоретический материал

Организация обмена данными между приложениями, а именно между процесса­ми этих приложений, является достаточно трудоемкой задачей. Архитектура Win32 подразумевает максимальную изоляцию выполняющихся приложений друг от друга. Каждое приложение исполняется в своем виртуальном адресном пространстве, которое изолировано и не имеет доступа к памяти других процес­сов приложений.

Но довольно часто возникает необходимость передачи данных из одного выполняющегося процесса в другой. Это вызвано тем, что функциональ­ные приложения и пакеты программ исполняются не в одном процессе, поэтому для нормальной работы используются основные возможности межпроцессного взаимодействия.

Мощным и гибким методом организации обмена данными между npиложениями является метод, который базируется на проецируемых в память файлах (Files Mapping). Главная идея этого механизма основывается на использовании динамической разделяемой памяти системы для хранения в ней данных.

Как известно, каждый процесс имеет свой участок памяти, называемый виртуальным адресным пространством. При использовании механизма проецируемых в память файлов данные становятся доступны из любого процесса, который использует этот файл. В этом случае говорят, что файл отображается в виртуальное адресное пространство процесса, поэтому данные, хранимые в файле, доступны процессу, который этот файл открыл.

Механизм проецирования файлов в память используется, например, для исполняемых файлов приложений, а также для DLL.

Для работы с проецируемыми в память файлами существует целый ряд API-функций. Но прежде чем их рассматривать, разберемся в процессе организации обмен данными через проецируемые файлы.

На первом этапе необходимо создать объект (файл, отображаемый в память), затем «отобразить» созданный объект в адресное пространство процесса приложения, получая возможность записи и чтения данных их этого файла. При отображении файла на определенный участок памяти (адресного пространства процесса) манипуляции с данными этого участка памяти отражаются на содержимом файла. После произведенных над объектом манипуляций обходимо закрыть доступ к данным файла (удалить проекцию и закрыть файл).

Рассмотрим некоторые функции для работы с проецируемым в память файле.

Для того чтобы создать объект файла, проецируемого в память, можно использовать функцию CreateFileMapping. Ее синтаксис выглядит следующим образом:

function CreateFileMapping(hFile: THandle;

lpFileMappingAttributes; PSecurityAttributes;

flProtect, dwMaximumSizeHigh, dwMaximumSizeLow: DWORD;

lpName: PChar ): THandle;

Параметры функции:

  • hFile — идентификатор файла. В результате присвоения этому аргументу значения константы INVALID_HANDLE_VALUE мы свяжем создаваемый объект файлового отображения со страничным swap-файлом (системным файлом подкачки).

  • lpFileMappingAttributes — указатель на структуру типа TSecurityAttributes. Структура содержит параметры безопасности создаваемого файла.

  • flProtect — параметр, задающий способ совместного использования создава­емого объекта в случае доступа на чтение и запись принимает значение PAGE_READWRITE.

  • dwMaximumSizeHign — старший разряд 64-битного значения размера выделя­емого объема памяти.

  • dwMaximumSizeLow — младший разряд 64-битного значения размера выделя­емого объема памяти.

  • lpName — имя объекта проецируемого файла (может быть nil для создания безымянной проекции файла).

Функция возвращает глобальный дескриптор (THandle). Если проецируемый файл не создан, то функция CreateFileMapping возвращает нулевое значение.

После того как проецируемый файл был создан, необходимо отобразить его в адрес­ное пространство процесса. Для этого предназначена функция MapViewOf File, имеющая следующий синтаксис:

function MapViewOfFile(hFileMappingObject: THandle;

dwDesiredAccess : DWORD;

dwFileOffsetHigh, dwFileOffsetLow,

dwNurnberOfBytesToMap: DWORD ): Pointer;

Функция имеет следующие параметры:

  • hFileMappingObject — описатель созданного объекта файлового отображения.

  • dwDesiredAccess — параметр доступа к полученным данным, в случае чте­ния и записи принимает значение FILE_MAP_WRITE.

  • dwFileOffsetHigh, dwFileOffsetLow — 64-битное смещение от начала файла.

  • dwNurmberOfBytesToMap — указывает, сколько байт будет отображено. Если этот аргумент имеет значение 0, то на область памяти будет отображен весь файл.

В результате успешного выполнения функции MapViewOfFile будет получен ука­затель (тип Pointer) на начальный адрес данных объекта. Указатель будет исполь­зоваться в дальнейшем для записи или чтения файла.

Следующей функцией, противоположной по производимым действиям функции MapViewOfFile, является UnMapViewOfFile Она отключает проецируемый файл от текущего процесса:

function UnMapViewOfFile(lpBaseAddress: Pointer): Boolean;

Функция принимает указатель, возвращаемый MapViewOfFile, и использует его для отмены проекции файла на адресное пространство процесса. В случае успеш­ной выгрузки функция возвращает True, в противном случае — False.

И последняя функция, которую необходимо рассмотреть, — это CloseHandle. Она используется для закрытия дескриптора (многих системных объектов, а не только проекции файла).

function CloseHandle(hFileMapObj: THandle):

Boolean;

Как видно из синтаксиса функции она принимает описатель объекта файлового отоб­ражения, полученный в результате выполнения функции CreateFileMapping и освобождает его. Для правильного завершения работы с объектом файлового отображения сначала следует применить функцию UnMapViewOfFile, а затем CloseHandle.

Сама проекция файла будет удалена только после того, как будут закрыты все де­скрипторы во всех использующих эту проекцию процессах.

Задание 1. Создать приложение, которое будет записывать в проецируемый в память файл строку и спустя некоторое время считы­вать ее оттуда.

Это пример работы с проекцией файла в рамках одного приложения.

Ход выполнения задания:

1. Создать форму, содержащую стандартное поле ввода, кнопку, метку и таймер. Программа будет работать следующим образом: строка, записанная в поле редактора, после нажатия кнопки помещается в проецируемый файл. Далее спус­тя некоторое время (задается таймером), содержимое файла считывается и зада­ется в качестве заголовка метки (рис. 6).

Рис. 6. Экранная форма приложения, использующего

проецируемый файл

2. В секцию описания переменных программы помещаем следующие объявления:

var

Form1: TForm1;

// Глобальные переменные

// Описатель FileMapping

hFileMapObj: THandle;

// Указатель на начальный адрес данных

lpBaseAddress:PChar;

3. Создание проецируемого файла и его отображение в адресное пространство процесса выпол­няется в момент создания формы:

// Создадим FileMapping с именем FileMemory

// и передадим полученный в результате описатель

// в глобальную переменную hFileMapObj

hFileMapObj := CreateFileMapping (MAXDWORD, Nil, PAGE_READWRITE, 0, 4,' FileMemory');

If (hFileMapObj = 0) Then

ShowMessage('Не могу создать проецируемый файл!')

Else

// Подключим файл к адресному пространству

// и получим начальный адрес данных

lpBaseAddress := MapViewOfFile (hFileMapObj, FILE_MAP_WRITE, 0, 0, 0);

If lpBaseAddress = Nil Then

ShowMessage('Не могу подключить проецируемый файл!');

4. После инициализации файла его можно использовать, т.е. копировать данные в проецируемый файл. Для этого в процедуре события OnClick кнопки написать следующий текст:

// Считываем данные в дополнительную переменную

StrPCopy(lpBaseAddress,edVariable.Text);

5. После нажатия кнопка, данные помещаются в проецируемый файл. По истечении некоторого времени, заданного таймером, строка устанавливается в качестве текста метки:

lbVariable.Caption:=PChar(lpBaseAddress);

6. В момент завершения приложения необходимо отключить проецируемый файл от адресного пространства процесса и закрыть объект файла:

// Отключим файл от адресного пространства

UnMapViewOfFile(lpBaseAddress);

// Освобождаем объект файла

CloseHandle(hFileMapObj);

// Закрываем форму

Action := caFree;

Задание 2. Составить постановку задачи и разработать программу, позволяющую реализовать организацию обмена данными методом проецируемого в память файла.

Результаты работы:

  • отлаженные программы по всем заданиям, принятые преподавателем;

  • отчет по заданию 2.