Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Функции виртуальной памяти

Win32 API предоставляет несколько функций для работы с виртуальной памятью. GetSystemInfo, GlobalMemoryStatus и VirtualQuery используются для определения состояния виртуальной памяти процесса.

 

VOID GetSystemInfo (

LPSYSTEM_INFO lpSystemInfo

);

 

typedef struct_SYSTEM_INFO {

DWORD dwOemld;

DWORD dwPageSize;

LPVOID lpMinimumApplicationAddress;

LPVOID lpMaximumApplicationAddress;

DWORD dwActiveProcessorMask;

DWORD dwNumberOfProcessors;

DWORD dwProcessorType;

DWORD dwAllocationGranularity;

DWORD dwReserved;

} SYSTEM_INFO,*LPSYSTEM_INFO;

 

Эта функция заполняет lpSystemInfo, чтобы проинформировать вас о различных установках виртуальной памяти. dwPageSize – размер страницы, lpMinimumApplicationAddress – нижний адрес, который можно использовать без ошибок памяти. lpMaximumApplication Address – старший адрес, который может использовать приложение. Функция VOID GlobalMemoryStatus (LPMEMORYSTATUS lpBuffer) возвращает более детальную информацию о виртуальной памяти в структуре MEMORYSTATUS.

 

typedef struct_MEMORYSTATUS {

DWORD dwLength;

DWORD dwMemoryLoad;

DWORD dwTotalPhys;

DWORD dwAvailPhys;

DWORD dwTotalPageFile;

DWORD dwAvailPageFile;

DWORD dwTotalVirtual;

DWORD dwAvailVirtual;

} MEMORYSTATUS, *LPMEMORYSTATUS;

 

dwMemoryLoad параметр – это значение между 0 и 100, которая отражает относительную утилизацию физической памяти. Это число полезно только, если вы часто его используете и интуитивно чувствуете.

dwTotalPhys – общий объем физической памяти, сконфигурированный в машине.

dwAvailPhys - тот объем физической памяти, который не занят рабочими наборами – доступен для использования.

dw Total Page File – общее число байт, которые можно сохранять в файле страниц, а dwAvail PageFile – число байт, которые доступны в файле страниц (свободны)

dwTotalVirtual – размер пользовательской части всего адресного пространства

dwAvailVirtual – число доступных адресов.

 

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

 

DWORD VirtualQuery(

LPCVOID lpAddress,

PMEMORY_BASIC_INFORMATION lpBuffer,

DWORD dwLength

);

 

lpAddress это адрес арбитр в адресном пространстве, перед использованием он устанавливается с учетом нижней границы страницы. Соответствующие страницы принадлежат к набору страниц в блоке, и все будут иметь одинаковые свойства, заданные при передаче. Вызов VirtualQuery с любым адресом в блоке будет возвращать будет возвращать одинаковую информацию в структуре MEMORY_BASIC_INFORMATION для каждого адреса в блоке.

 

typedef struct_MEMORY_BASIC_INFORMATION {

PVOID BaseAddress;

PVOID AllocationBase;

DWORD AllocationProtect;

DWORD RegionSize;

DWORD State;

DWORD Protect;

DWORD Type;

}MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

 

BaseAddress адрес первой страницы в блоке, а AllocationBase адрес где начинается регион.Поле AllocationProtect задает разрешенный доступ к страницам в блоке (только для чтения, для чтения и записи, для выполнения и т.д.). RegionSize – число байтов в блоке (блок страниц входящих в регион). Поле состояния может принимать значения: MEM_COMMIT, MEM_RESERVE или MEM_FREE. Protect определяет тип защиты страниц в блоке. Type определяет тип страниц, которые будут сохраняться в регионе (MEM_IMAGE, MEM_MAPPED, MEM_PRIVATE).

 

Расширенная версия VirtualQuery позволяет потоку запросить блок виртуальной памяти у другого процесса.

 

DWORD VirtualQueryEx (

HANDLE hProcess,

LPCVOID lpAddress,

PMEMORY_BASIC_INFORMATION lpBuffer,

DWORD dwLength

);

 

Описатель (Handle) вызывающего потока должен иметь доступ PROCESS_QUERY_INFORMATION к удаленному процессу.

Функции VirtualAlloc и VirtualFree используются для динамического резервирования, передачи и освобождения памяти.

 

LPVOID VirtualAlloc (

LPVOID lpAddress,

DWORD dwSize,

DWORD flAllocationType,

DWORD dwProtect

);

 

VirtualAlloc используется и для резервирования и для передачи (необходимо помнить, что граница региона определяется единицами выделения памяти системой, а граница блока определяется границами страницы).

flAllocationType определяет различные типы операции выделения памяти – MEM_COMMIT (блок передан); MEM_RESERVE (операция резервирования региона); вы можете комбинировать MEM_COMMIT и MEM_RESERVE при вызове, чтобы регион был зарезервирован и каждая страница региона была бы передана.

MEM_RESET определяет, что блок страниц не будет сохранен в файле страниц при перезаписи. flProtect определяет защиту по доступу. VirtualAllocEx позволяет одному процессу резервировать и передавать адреса в адресное пространство другого процесса.

VirtualFree и VirtualFreeEx используются для освобождения адресного пространства.

 

LPVOID VirtualFree (

LPVOID lpAddress,

DWORD dwSize,

DWORD dwFreeType

);

 

Существует 5 функций, используемых для блокировки («lock») страниц в первичной памяти. Такие страницы не могут быть переписана системой виртуальной памяти во вторичную память.

 

BOOL VirtualLock (

LPVOID lpAddress,

DWORD dwSize

);

 

Мы блокируем переданный до этого блок страниц в первичной памяти. Адреса страниц в пределах от lpAddress до lpAddress + dwSize. Максимум 30 страниц могут быть заблокирован в первичной памяти.

Если физической памяти не хватает, то заблокированные страницы только ухудшают эту ситуацию, т.к. они не дают возможность работать механизму рабочих наборов. В будущем страницы будут заблокированы, даже когда процесс-владелец бездействует (но блокировка будет снята, когда процесс закончится). Если у процесса привилегия SE_INC_BASE_PRIORITY_NAME, то это позволяет увеличивать его рабочий набор, используется SetProcessWorkingSetSize.

Заблокированные страницы можно разблокировать используя

 

BOOL V irtualUnlock (

LPVOID lpAddress,

DWORD dwSize

);

 

Много потоков могут вызвать VirtualLock, но только один вызвавший VirtualUnlock разблокирует блок страниц.

Если вы хотите, чтобы каждой операции блокирования соответствовала операция разблокирования, вы должны использовать GlobalLock и GlobalUnlock или LocalLock и LocalUnlock для управления объектами локальной и глобальной памяти соответственно.

ReadProcessMemory и WriteProcessMemory могут использовать для чтения/записи одним процессом памяти другого процесса, в случае, если вы получили описатель этого процесса с соответствующими привилегиями. Это мощный механизм совместного использования памяти (см. MSDN Home Page).

<== предыдущая лекция | следующая лекция ==>
Страничная система изнутри | Лекция 6 новые решения безопасеости беспроводной связи. Стандарт 802. 1х. Стандарт WPA и WPA2 (802. 11i)
Поделиться с друзьями:


Дата добавления: 2014-01-14; Просмотров: 1075; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.02 сек.