■ 색션 객체

- OS가 관리하는 특별한 메모리

- 하나 이상의 공간에 매핑 될 수 있음(App간에 공유메모리 설정이 쉬워진다)

- 시스템은 색션객체를 이용하여 커널모드 프로세스와 유저모드 프로세스 간에 메모리를 공유할 수 있음

- Win32에서는 메모리 맵 파일이라고 부름

 

Pagefile-Backed : 정보를 일시적으로 저장하고 프로세스 간이나 App , 커널과의 데이터 공유를 위해서 사용됨.

 

File-Backed : 하드 드라이브의 물리 파일을 매핑함

이 섹션은 매핑되면서 매핑 대상의 파일의 내용을 포함하며, 매핑된 메모리 내용이 변경되면 파일의 내용도 그대로 변경됨. 이는 메모리 영역의 포인터만을 이용해서 직접 파일의 내용에 접근이 가능함을 의미함

 

VAD 트리(Virtual Address Descriptor)

- VAD트리는 개별 프로세서의 주소할당을 관리하기 위해 윈도우가 사용하는 데이터 구조체

- 바이너리 트리 구조

- 각 프로세스마다 고유한 자신의 VAD트리를 보유

 

Mapped allocation : 주소 간 안에 매핑된 메모리 맵 파일(프로세스 주소공간에 로드된 모든 실행 바이너리와 모든 메모리 맵 파일)

 

Private allocation : 프로세스 안에 지역적으로 할당된 메모리(ex: Heap, Stack)

 

 

■ 유저 모드 메모리

Private Allocation

 - 프로세스에서 가장 기본적인 형태의 메모리 할당

 - App virtualAlloc Win32 API를 이용해서 메모리 블록을 요청

 - 항상 페이지 크기 단위

 - 시스템이 스택이나 힙을 할당할 때 사용

 

Heap

 - 힙 메모리 할당을 위해서는 virtualAlloc API를 사용하지 않음 à 런타임 라이브러리 함수 malloc이나 시스템 힘 API HeapAlloc을 사용함

 - App VirtualAlloc API를 이용해서 메모리 블록을 직접 할당함으로써 자신만의 힙을 구할 수 있음

 

Stack

 - 스레드가 생성되는 동안에 해당 스레드를 위한 스택을 자동 할당

 - 유저모드 스택은 스레드 내부에서만 사용됨

 

• 실행

 - 시스템은 App 코드를 실행하기 위해 코드를 메모리 맵 파일로서 메모리에 로드함

 

• 맵 뷰(섹션)

 - App은 메모리 맵 파일을 생성해서 그것을 주소 공간에 매핑시킬 수 있음(두개 이상의 프로그램이 메모리를 공유할 수 있는 일반적임 방법)

 

■ 메모리 관리 API

Win32 로우레벨 메모리 관리 API

VirtualAlloc

 - 유저모드 주소 공간에 메모리 블록을 할당

 - 메모리 블록의 크기는 항상 페이지 크기의 배수

    reserve type : 실제로 주소 공간에 메모리를 할당하지 않고 단순히 예약만 함

    commit type : 실제로 시스템 페이지 파일 안에 메모리 공간을 할당

 

VirtualProtect

  - 메모리 영역의 보호 설정 값을 변경함

 

VirtualQuery

  - 메모리 블록의 종류가 무엇인지, 사용되지 않고 있는 메모릴 블록인지 등과 같은 메모리 정보 질의

 

VirtualFree

  - 할당된 메모리 블록 해제


+ Recent posts