Лекция №5

2. Набор функций вирт. с префикс. (ВП), которые предназначены для непосредственной работы с памятью. Работают минимально со страницей.

LPVOID VirtualAlloc(

LPVOID Addres,

SIZE_T Bytes,

DWORD Alloctype,

DWORD Protection,

);

Небольшое отступление:

В Windows ВП могут находиться в трех состояниях

1. Free – свободное

2. Reserve – зарезервированное

3. Commit – выделенная

Free – физических носителей не выделено, адресного пространства не выделено

Reserve – выделено множество адресов, а физической памяти не выделено

Commit – есть адреса и физическое хранилище

Функция VirtualAlloc позволяет двигаться в направлении Free->Reserve->Commit

Addres – адрес, по которому мы хотели бы выделить память, если все равно где выделять, то можно указать 0.

Bytes – размер участка, который нам нужен. Но размер будет округлен в большую сторону до размера страницы

Alloctype – что именно мы хотим сделать:

MEM_RESERVE – зарезервировать

MEM_COMMIT – выделить кусок

MEM_RESET - указывает системе, что вам временно указанный участок памяти не нужен, но мы его не освобождаем

MEM_DOWN – приказ системе найти участок памяти в как можно более старших адресах

Protection – атрибуты защиты системы

PAGE_READONLY – страницу можно только читать

PAGE_READWRITE – данные, которые можно и читать и писать

PAGE_EXECUTE – код, но его нельзя ни читать ни писать

PAGE_EXECUTE_READ – код, который можно читать как данные

PAGE_EXECUTE_READWRITE – код, который можно и читать и писать как данные

PAGE_NOACCESS – никакого доступа (нельзя читать и писать)

PAGE_WRITECOPY:

PAGE­­­­­­­_NOCACHE – не кэшировать страницы в проц-ый кэш

Небольшое отступление:

ПИРАМИДА ПАМЯТИ

Чем ниже память, тем она больше и дешевле. Кэширование: используется часть из более быстрой памяти для хранения данных из более медленной с целью уменьшить среднее время доступа.

PAGE_GUARD - защитная страница

3.

BOOL VirtualFree(

LPVOID Ptr,

SIZE_T Bytes,

DWORD FreeType

);

FreeType: MEM_DECOMMIT – переводим из COMMIT в RESERVE(физической памяти нет, а адреса остались)

MEM_RELEASE – освобождаем память

Указатель Ptr должен быть установлен на начало выделенного блока, а размер установлен в 0, Bytes округляется в меньшую сторону до размера страницы.

BOOL Virtual[lock/unlock](

LPVOID Ptr,

SIZE_T Bytes

);

Virtuallock блокирует участок страниц в физической памяти, запрещая механизм SWAP. Процесс не может заблокировать страниц памяти меньше, чем размер его рабочего набора, который по умолчанию =32страницы – 128 Кб. Увеличивать рабочий размер можно, но для этого нужны права администратора.

Virtualunlock – наоборот.

BOOL VirtualProtect(

LPVOID Ptr,

SIZE_T Bytes,

DWORD Protection,

DWORD OldProtect

);

Изменяет защиту страницы.

Protection – новые атрибуты защиты

В OldProtect будет записан старый атрибут защиты.

4. Функции для работы с кучей.

Куча – системный объект, который в участке ВП организует динамическое выделение памяти. Используется, когда надо работать с небольшими участками с постоянным выделением и освобождением памяти. Кучу можно создать.

Возвращает дескриптор системного блока.

HANDLE HeapCreate(

DWORD Options,

SIZE_T ImtSize,

SIZE_T MaxSize

);

Options – опции при создании кучи:0.

ImtSize – начальный размер кучи.

MaxSize – максимальный размер кучи.

Если не получается создать кучу, то функция возвращает значение INVALID_HANDLE_VALUE.

Выделить кусок памяти из кучи

LPVOID HeapAlloc(

HANDLE heap,

DWORD Options,

SIZE_T Bytes

);

heap – из какой кучи выделить.

Options – HEAP_ZERO_MEMORY – выделить и занулить участок памяти.

Bytes – размер в байтах.

Освободить память:

BOOL HeapFree(

HANDLE heap,

DWORD Options,

LPVOID Ptr

);

Заблокировать/разблокировать общую кучу(с этой кучей могут/не могут выполнять различные операции другие процессы)

BOOL Heap[lock/unlock] (HANDLE heap);

Удаляет кучу полностью:

BOOL HeapDestroy (HANDLE heap);


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: