운영체제 메모리 구조에 대해서 알아보자.
OS 메모리 구조에는 2가지 영역으로 나누는데 바로 유저 영역, 커널 영역이다.
그런데 왜 2영역으로 나뉘어져 있을까?
시스템 운영에 필요한 메모리, 그리고 운영체제가 커널 영역에 올라가 있는데 만약 사용자가 운영체제가 올라가 있는 커널 영역에 마음대로 접근할 수 있다면…? 시스템이 안정적으로 운용될 수 없을것이다.
그렇기 때문에 사용자가 함부로 커널 영역에 접근할 수 없도록 메모리를 유저영역과 커널영역을 나누어 사용하는 것이다. 나누는 크기는 운영체제마다 다르고, 설정에 따라 영역의 크기를 조정할 수도 있다는 점.
유저 영역
유저영역에는 4가지로 나눠지는데 코드영역, 데이터영역, 힙영역, 스택 영역으로 구분이 된다.
1. 코드영역
프로그램의 코드가 올라가는 영역이다. 여기서 코드는 컴파일된 기계어 코드를 뜻한다.
일단 가장 먼저 메모리에 코드가 올라온다.
c소스를 컴파일하면 어셈블리 코드로 해당 C소스를 볼 수 있다. 이 어셈블리 코드가 코드 영역에 올라 가게 된다.
주소를 보면 32bit 시스템에서 익숙한 0804~로 시작하는데. 메모리에 코드가 올라갈 때 보통 저 영역에 올라간다.
2. 데이터영역
전역 변수와 정적 변수 등이 할당되는 영역이 바로 데이터 영역이다.
좀 더 세분화하면, 초기화 된 데이터는 data 영역에 저장되고 초기화 되지 않은 데이터는 bss 영역에 저장이 된다.
전역변수가 이 영역에 로드되는데 항상 동일한 메모리에 위치하게 되는데.
사용자가 입력하는 값이 전역변수로 정의되어있다고 가정해보자.
고정된 메모리 주소 그리고 그 주소에 원하는 값을 쓸 수 있다면? 익스플로잇에 활용될 가능성이 있다. 여기까지가 고정된 주소에 올라오는 영역이다.
3. 힙영역
힙 영역은 동적으로 메모리를 할당하여 사용하는 공간이다.
대표적인 메모리 할당 함수로는 malloc 이라는 함수이다. malloc으로 필요한 공간을 할당하면 힙 영역을 쓰게 되는데. 쓰다가 필요 없어지면 free를 이용하여 해제 해주면 된다.
4. 스택영역
지역 변수와 매개변수가 저장되는 영역이 스택영역이다. 함수가 시작되면 해당 함수의 지역 변수가 스택에 쌓였다가 함수가 종료되면 해당 영역을 free로 해제해준다
스택은 메모리의 가장 바닥부터 채워진다
스택영역은 함수인자나 지역변수들이 올라온다.
보통 스택 주소보면 0xbfff이런식으로 되어 있다.
댓글