개요
이번에는 간단하게 프로세스 메모리 구조에 대해 알아보겠습니다.
프로세스 메모리 구조는 하나의 프로세스의 메모리가 가지는 공간의 구성을 보여줍니다.
프로세스의 메모리
여기서 말하는 프로세스의 메모리란 프로그램을 시작했을 때 할당되는 가상메모리를 의미합니다.
x86이라면 4GB(유저영역 2GB) , x64라면 256TB(128TB)입니다. 물론 실제 사용하는 공간만 매핑됩니다.
Windows x86 Process Virtual Memory Layout
(개념도, 실제 배치는 ASLR/로더/할당 상태에 따라 달라짐)
높은 주소
0xFFFFFFFF +--------------------------------------+
| Kernel Space |
0x80000000 +--------------------------------------+
| 사용자 공간의 높은 주소 영역 |
| - DLLs (주로 MEM_IMAGE) |
| - mapped views |
| - thread stacks (high -> low) |
| - free regions |
+--------------------------------------+
| 여러 private allocation / heaps |
| mapped files / free regions 혼재 |
+--------------------------------------+
| EXE image |
| - .text |
| - .rdata |
| - .data |
| - .bss |
+--------------------------------------+
| 사용자 공간의 낮은 주소 영역 |
| (보통 미사용/예약 안 된 공간 많음) |
0x00000000 +--------------------------------------+
낮은 주소
매번 보면 프로세스 메모리를 나타내는 예시에서는 중간에 빈 공간이 존재하고 스택과 힙이 확장하며 이 빈 공간을 점점 점유하는 모양새로 보여집니다.
예시
높은 주소
+---------------------------+
| Stack |
| ↓↓↓ |
| |
| Free Space |
| |
| ↑↑↑ |
| Heap |
+---------------------------+
| Code / Data / BSS |
+---------------------------+
낮은 주소
하지만 실제로는 전체 가상메모리 내에서 각자의 공간을 reserve하고 commit하며 진행되기 때문에 서로 영향을 주거나 하지는 않습니다.
자세한 논의는 미루고 오늘은 각각의 기본적인 역할만 간단하게 다루겠습니다.
스택
스택은 지역변수, 함수 등 각 스레드가 함수 호출을 수행하면서 임시 실행 정보를 쌓아 두는 메모리 영역입니다.
스택은 처음 시작 시에 1MB를 reserve하며 1개의 page를 커밋합니다.
VirtualQuery를 통해 확인해보면
BaseAddress: 01200000, AllocationBase: 01200000, RegionSize: 0xfa000, State: MEM_RESERVE, Protect: UNKNOWN_PROTECT, Type: MEM_PRIVATE
BaseAddress: 012FA000, AllocationBase: 01200000, RegionSize: 0x2000, State: MEM_COMMIT, Protect: PAGE_READWRITE, Type: MEM_PRIVATE
BaseAddress: 012FC000, AllocationBase: 01200000, RegionSize: 0x4000, State: MEM_COMMIT, Protect: PAGE_READWRITE, Type: MEM_PRIVATE
시작 커밋 페이지와 가드 페이지 reserve된 메모리 합쳐 1MB가 되는 것을 확인할 수 있습니다.
스택 포인터의 위치에 따라 메모리를 사용하기 때문에 데이터가 영속적이지 않습니다.
힙
힙은 동적 메모리 할당을 통해 사용하는 메모리입니다.
new, delete 혹은 malloc, free 등 이를 다루는 전용 함수를 통해 내부의 힙을 이용할 수 있습니다.
이 때 사용되는 힙은 디폴트 힙입니다. 별도의 힙을 만들 수도 있습니다.
힙 메모리는 유저가 직접할당하는 메모리로 스택과 다르게 해제하지 않는다면 계속해서 메모리에 남게 됩니다.
해제하지 않는다면 memory leak이 발생할 수 있습니다.
전역/정적 변수 : 전역 변수 등의 메모리는 스택, 힙과 다르게 프로세스 시작 시 고정된 크기를 미리 차지하고 있습니다. 아래에 이어 서술하겠습니다.
코드 영역(.text): 말 그대로 코드가 들어있는 영역입니다. 코드를 EIP같은 instructor pointer가 가리켜 이를 실행시킵니다.
초기화된 전역변수(.data): 초기화된 전역변수가 들어갑니다.
초기화되지 않은 전역변수(.bss): 초기화 되지 않은 전역변수가 들어갑니다.
.data의 데이터들은 실행파일에 들어있어야하지만 .bss의 데이터들은 저장할 필요가 없어 구분이 되어있습니다.
추가적으로 DLL등의 메모리도 올라갑니다.
'CS > CS' 카테고리의 다른 글
| [1일 1CS] OSI 7계층 (0) | 2026.03.20 |
|---|