참고한 것들
Virtual Address Space (VAS)
- Process 가 사용하는 virtual memory address 의 주소공간을 Virtual Address Space (VAS) 라고 하는데,
- 이 공간을 어떻게 사용하고 있냐… 뭐 흔히 보이는 code-data-heap-stack 그림이다:
- 일단 어느 정도의 padding (Unused) 공간이 등장한 다음에:
- Code 는 read-only 이고, 따라서 Read-only segment 라고도 불린다.
- Data 는 당연히 read-write 공간이고, 따라서 Read-write segment 라고도 불린다.
- 여기에는 대표적으로 global variable 이 저장된다.
- 여기 공간은 또 두 개로 나눌 수 있는데
- 처음부터 초기화되어 있는 값들은 Initialized Data (
.data
) 에 담기고 - 초기화되어있지 않은 값들은 Uninitialized Data (
.bss
) 에 담긴다.- BSS 라는게 있는데, Block Started Symbol 이란 뜻이다. 일단은 BSS 란 용어를 보면 uninitialized data 공간 말하는구나… 라고 생각하자.
- 처음부터 초기화되어 있는 값들은 Initialized Data (
- Heap 공간은 메모리 동적할당을 위한 공간인데,
- 많이 쓰는 malloc 은 library 함수이고 syscall 이 아니다.
malloc
은 heap 공간을 갖고 장난치다가 여기에 공간이 부족해 지면sbrk
라는 syscall 을 부르고 이때 heap 이 늘어나는 것
- Stack 공간은 당연히 function call stack 이다.
- Local memory 의 경우 여기에 들어간다.
- Heap 과 Stack 은 역방향으로 커져 차지하는 공간을 서로 견제하도록 되어 있다.
- Heap 와 Stack 사이에는 Shared Library 공간이 들어가기도 한다.
- 즉, shared library 의 경우에는 code 에 넣는 것은 비효율적이니까 그냥 address mapping 만 저기 중간에 해주는 것.
- 그리고 stack 아래에는 kernel memory space 가 있어서 kernel mode 로 진입하면 여기로 가게 된다.
- 옛날에는 kernel virtual memory 공간 전체가 다 붙어있어서 단순히 Virtual addr 를 bitwise operation 하는 것으로 여기로 진입할 수 있었다. (물론 kernel mode 라는 전제 하에.)
- 하지만 이제는 meltdown attack 라는 취약점이 발견되어 user VAS 공간에 kernel VAS 는 최소한만 남겨두고 완전히 분리시킨다고 한다.