VirtualAlloc 함수를 이용해서 메모리 예약, 커밋, 해제를 직접 사용해보자
#include <stdio.h>
#include <Windows.h>
SIZE_T maxPage = 10;
SIZE_T pageCount = 0;
SYSTEM_INFO si;
LPVOID baseAddr;
int PageFaultExceptionFilter(DWORD);
int main()
{
GetSystemInfo(&si);
baseAddr = VirtualAlloc(
NULL,
si.dwPageSize * maxPage,
MEM_RESERVE,
PAGE_NOACCESS);
int dataSize = (si.dwPageSize * maxPage) / sizeof(int);
int* dataArr = (int*)baseAddr;
for (int i = 0; i < dataSize; i++)
{
__try
{
dataArr[i] = i;
}
__except (PageFaultExceptionFilter(GetExceptionCode()))
{
ExitProcess(GetLastError());
}
Sleep(0);
}
return 0;
}
int PageFaultExceptionFilter(DWORD exptCode)
{
// 예외 원인이 page fault 가 아니라면
if (exptCode != EXCEPTION_ACCESS_VIOLATION)
{
printf_s("Exception Code = %d \n", exptCode);
return EXCEPTION_EXECUTE_HANDLER;
}
printf_s("Exception is a page fault \n");
if (pageCount >= maxPage)
{
printf_s("Out of Page \n");
return EXCEPTION_EXECUTE_HANDLER;
}
void* nextPageAddr = (char*)baseAddr + si.dwPageSize * pageCount;
LPVOID result = VirtualAlloc(
nextPageAddr,
si.dwPageSize,
MEM_COMMIT,
PAGE_READWRITE
);
if (result == NULL)
{
printf_s("VirtualAlloc fail \n");
return EXCEPTION_EXECUTE_HANDLER;
}
else
{
printf_s("Allocating another page. \n");
}
pageCount++;
return EXCEPTION_CONTINUE_EXECUTION;
}
반응형
'공부' 카테고리의 다른 글
20200831 공부 (0) | 2020.09.01 |
---|---|
24bit BMP 파일 읽어서 윈도우 출력 (0) | 2020.08.25 |
쓰레드 동기화 인터락 함수 (0) | 2020.08.06 |
쓰레드 동기화, 임계영역 접근 동기화 (0) | 2020.08.06 |
컨텍스트 스위칭 (Context Switching) (0) | 2020.08.04 |