Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОС СФМЭИ.doc
Скачиваний:
22
Добавлен:
17.09.2019
Размер:
1.37 Mб
Скачать

Контрольные вопросы

  1. С помощью какой функции можно получить информации о версии ОС?

  2. Как получить информации о логическом диске?

  3. С помощью какого объекта Delphi возможен программный доступ к реестру?

  4. Как получить информацию о системных каталогах Windows?

  5. Поясните различие между ассемблерными командами SUB и SBB.

2. Лабораторная работа №2

ИССЛЕДОВАНИЕ ВИРТУАЛЬНОЙ ПАМЯТИ

2.1.Цель работы

Целью работы является изучение основных функций ядра Kernel32.dll для работы с виртуальной памятью. Рассматриваемые в данной лабораторной работе функции позволяют:

  • получить информацию о состоянии системной памяти и виртуального адресного пространства любого процесса;

  • напрямую резервировать регион адресного пространства;

  • передавать зарезервированному региону физическую память;

  • освобождать регионы адресного пространства;

  • изменять атрибуты защиты страниц виртуальной памяти.

2.2. Теоретическое введение

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

Процедура GetSystemInfo – получение системной информации.

Процедура имеет следующий вид:

procedure GetSystemInfo(var lpSystemInfo: TSystemInfo); stdcall;

При вызовы данная процедура работает со структурой SYSTEM_INFO

Структура SYSTEM_INFO имеет следующий вид

_SYSTEM_INFO = record

case Integer of

0: (

dwOemId: DWORD);

1: ( wProcessorArchitecture: Word; wReserved: Word;

dwPageSize: DWORD; lpMinimumApplicationAddress: Pointer;

lpMaximumApplicationAddress: Pointer;

dwActiveProcessorMask: DWORD; dwNumberOfProcessors: DWORD;

dwProcessorType: DWORD; dwAllocationGranularity: DWORD;

wProcessorLevel: Word; wProcessorRevision: Word);

end;

Описание полей структуры SYSTEM_INFO приведено в таблице 2.1.

Таблица 2.1 Описание полей структуры SYSTEM_INFO

Наименование поля

Описание

1

2

wProcessorArchitecture

Используется начиная с Windows 2000; сообщает тип архитектуры процессора, например, Intel 386, 486 или Pentium

wReserved

Зарезервировано, пока не используется

dwPageSize

Размер страницы памяти. На процессорах x86 это значение равно 4096, а на процессорах Alpha – 8192 байта.

1

2

lpMinimumApplicationAddress

Минимальный адрес памяти доступного адресного пространства. В Windows 98 это значение равно – 4 194 304 (или 0х 00400000), поскольку нижние 4 Мб адресного пространства каждого процесса недоступны. В Windows 2000 и выше это значение равно 65 536 (или 0х00010000), так как в этой системе резервируются только первые 64 Кб адресного пространства каждого процесса.

lpMaximumApplicationAddress

Максимальный адрес памяти доступного адресного пространства, отведенного в «лмчное пользование» каждому процессу. В Windows 98 этот адрес равен – 2 147 483 647 (или 0х7FFFFFFF), так как верхние 2 Гб занимают общие файлы, проецируемые в память и разделяемый код операционной системы. В Windows 2000 и выше этот адрес соответствует началу раздела для кода и данных режима ядра за вычетом 64 Кб.

dwActiveProcessorMask

Битовая маска, которая сообщает, какие процессоры активны

dwNumberOfProcessors

Число процессоров в компьютере

dwProcessorType

Используется только в Windows 98; сообщает тип процессора, например, Intel 386, 486 или Pentium

dwAllocationGranularity

Гранулярность резервирования регионов адресного пространства. В настоящий момент равно 64Кб для всех платформ Windows.

Продолжение таблицы 2.1

1

2

wProcessorLevel

Используется только в Windows 2000 и выше. Сообщает дополнительные подробности об архитектуре процессора. Например, Intel Pentium Pro или Pentium II.

wProcessorRevision

Используется только в Windows 2000 и выше. Сообщает дополнительные подробности об уровне данной архитектуры процессора.

Процедура GlobalMemoryStatus – отслеживает текущее состояние памяти

Процедура имеет следующий вид:

procedure GlobalMemoryStatus(var lpBuffer: TMemoryStatus); stdcall;

Результат работы данной процедуры заносится в структуру MEMORYSTATUS, которая имеет следующий вид:

_MEMORYSTATUS = record

dwLength: DWORD; dwMemoryLoad: DWORD; dwTotalPhys: DWORD; dwAvailPhys: DWORD;

dwTotalPageFile: DWORD; dwAvailPageFile: DWORD; dwTotalVirtual: DWORD; dwAvailVirtual: DWORD;

end;

Описание полей структуры MEMORYSTATUS приведены в таблице 2.2.

Таблица 2.2 Описание полей структуры MEMORYSTATUS

Наименование поля

Описание

dwLength

Перед вызовом процедуры GlobalMemoryStatus в это поле надо записать размер структуры в байтах.

dwMemoryLoad

Примерная оценка занятости системы управления памятью. Это число может принимать значения в диапазоне от 0 до 100.

dwTotalPhys

Общий размер физической памяти в байтах

dwAvailPhys

Общее количество байт физической памяти, доступной для выделения.

dwTotalPageFile

Максимальное количество байтов, которое может содержаться в страничном файле на жестком диске.

dwAvailPageFile

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

dwTotalVirtual

Количество байт в адресном пространстве, принадлежащих «лично» данному процессу.

dwAvailVirtual

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

Функция VirtualQuery – вывод информации об участке памяти по заданному адресу.

Функция имеет следующий вид:

function VirtualQuery(lpAddress: Pointer; var lpBuffer: MemoryBasicInformation; dwLength: DWORD): DWORD; stdcall;

Параметры данной функции приведены в таблице 2.3

Таблица 2.3 Параметры функции VirtualQuery

Наименование параметра

Описание

lpAddress

Адрес виртуально памяти, о котором следует получить информацию

lpBuffer

Адрес структуры MEMORY_BASIC_INFORMATION

dwLength

Размер структуры MEMORY_BASIC_INFORMATION

При вызове данная функция заполняет структуру MEMORY_BASIC_INFORMATION, которая состоит из следующих полей:

_MEMORY_BASIC_INFORMATION = record

BaseAddress : Pointer; AllocationBase : Pointer;

AllocationProtect : DWORD; RegionSize : DWORD;

State : DWORD; Protect : DWORD; Type : DWORD;

end;

Описание полей структуры MEMORY_BASIC_INFORMATION приведены в таблице 2.4.

Функция VirtualQuery возвращает количество байт, записываемых в структуру MEMORY_BASIC_INFORMATION.

Таблица 2.4 Описание полей структуры MEMORY_BASIC_INFORMATION

Наименование поля

Описание

1

2

BaseAddress

Сообщает то же значение, что и параметр lpAddress, но округленное до ближайшего меньшего адреса, кратного размеру страницы

AllocationBase

Идентифицирует базовый адрес региона, включающего в себя адрес, указанный в параметре lpAddress

AllocationProtect

Идентифицирует атрибут защиты, присвоенный региону при его резервировании

RegionSize

Сообщает суммарный размер (в байтах) группы страниц, которые начинаются с базового адреса BaseAddress и имеют те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу, указанному в параметре lpAddress

Продолжение таблицы 2.4

1

2

State

Сообщает состояние (MEM_FREE, MEM_RESERVE или MEM_COMMIT) всех смежных страниц, которые имеют те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу, указанному в параметре lpAddress

Protect

Идентифицирует атрибут защиты (PAGE_*) всех смежных страниц, которые имеют те же атрибуты защиты, состояние и тип, что и страница, располо-женная по адресу, указанному в параметре lpAddress

Type

Идентифицирует тип физической памяти, (MEM_IMAGE, MEM_MAPPED или MEM_PRIVATE), связанной с группой смежных страниц, которые имеют те же атрибуты защиты, состояние и тип, что и страница, расположенная по адресу, указанному в параметре lpAddress. Подробное описание возможных типов физической памяти приведено в таблице 2.5.

Таблица 2.5 Описание типов физической памяти

Наименование типа

Описание

MEM_PRIVATE

Этот диапазон виртуальных адресов сопоставлен со страничным файлом.

MEM_IMAGE

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

MEM_MAPPED

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

Для просмотра информации о памяти в любом другом процессе используется функция VirtualQueryEx:

function VirtualQueryEx(hProcess: THandle; lpAddress: Pointer; var lpBuffer: TMemoryBasicInformation; dwLength: DWORD): DWORD; stdcall;

Функция VirtualQueryEx отличается от парной функции VirtualQuery наличием параметра hProcess, который представляет собой дескриптор того процесса, информацию о памяти которого требуется получить. Алгоритм определения дескриптора любого процесса будет рассмотрен в лабораторной работе № 6.

Функция VirtualAlloc – резервирование региона в адресном пространстве

Функция имеет следующий вид:

function VirtualAlloc(lpvAddress: Pointer; dwSize, flAllocationType, flProtect: DWORD): Pointer; stdcall;

Параметры данной функции приведены в таблице 2.6

Таблица 2.6 Параметры функции VirtualAlloc

Наименование параметра

Описание

lpvAddress

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

dwSize

Размер резервируемого региона в байтах

flAllocationType

Сообщает системе, что необходимо сделать (зарезервировать регион или передать физическую память региону). Если требуется только зарезервировать регион без передачи ему физической памяти указывается ключ MEM_RESERVE. Для передачи физической памяти региону указывается ключ MEM_COMMIT.

flProtect

Атрибут защиты, присваиваемый региону

Список атрибуты защиты региона приведен в таблице 2.7.

Таблица 2.7 Атрибуты защиты страниц виртуальной памяти

Наименование атрибута

Описание

1

2

PAGE_NOACCESS

Попытка чтения, записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа

PAGE_READONLY

Попытка записи или исполнения содержимого памяти на этой странице вызывают нарушение доступа

Продолжение таблицы 2.7

1

2

PAGE_READWRITE

Попытка исполнения содержимого памяти на этой странице вызывают нарушение доступа

PAGE_EXECUTE

Попытка чтения или записи на этой странице вызывают нарушение доступа

PAGE_EXECUTE_READ

Попытка записи на этой странице вызывают нарушение доступа

PAGE_EXECUTE_READWRITE

На этой странице возможны любые операции

PAGE_WRITECOPY

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

PAGE_EXECUTE_WRITECOPY

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

Функция VirtualAlloc возвращает виртуальный адрес региона. Если операционная система не сумеет найти в адресном пространстве подходящую область или не сумеет передать ей физическую память, то функция возвращает nil.

Функция VirtualFree – возврат физической памяти и освобождение региона

Функция имеет следующий вид:

function VirtualFree(lpAddress: Pointer; dwSize, dwFreeType: DWORD): BOOL; stdcall;

Параметры данной функции приведены в таблице 2.8

Таблица 2.8 Параметры функции VirtualFree

Наименование параметра

Описание

lpvAddress

Базовый адрес региона.

dwSize

Размер региона в байтах

dwFreeType

Сообщает системе, что необходимо сделать: MEM_RELEASE – возврат системе все физической памяти, отображенной на регион и освобождение самого региона

MEM_DECOMMIT – возвращает системе физическую память, переданную региону, не освобождая самого региона.

При успешном выполнении данная функция возвращает значение TRUE, в случае ошибки возвращается значении – FALSE.

Функция VirtualProtect – изменение атрибутов защиты

Функция имеет следующий вид:

function VirtualProtect(lpAddress: Pointer; dwSize, flNewProtect: DWORD; lpflOldProtect: Pointer): BOOL; stdcall;

Параметры данной функции приведены в таблице 2.9

Таблица 2.9 Параметры функции VirtualProtect

Наименование параметра

Описание

lpvAddress

Базовый адрес памяти.

dwSize

Число байтов, для которых изменяется атрибут защиты

flNewProtect

Один из идентификаторов PAGE_*, приведенных в таблице 2.7.

lpflOldProtect

Адрес переменной типа DWORD, в которую функция VirtualProtec заносит старое значение атрибута защиты для данной области памяти

При успешном выполнении данная функция возвращает значение TRUE, в случае ошибки возвращается значении – FALSE.