간단하게 리눅스 메모리 구조에 대해서 짚어보겠다.
리눅스 메모리 구조는 간단하게 표현하면 아래와 같다.
0x00000000
코드 세그먼트
------------
데이터 세그먼트
------------
BSS 세그먼트
------------
힙 세그먼트
------------
|
|
v
^
|
|
스택 세그먼트
------------
0xffffffff
여기서 힙은 아래로, 즉 주소가 높아지도록 자라고 스택은 위로, 즉 주소가 낮은 쪽으로 증가하기에 위와 같은 화살표로 표현하였다.
각 영역에 대해 간단하게 알아보자.
코드 세그먼트
- 실행 가능한 기계 코드가 위치, 코드를 실행해야 하므로 이 영역은 읽기, 실행 권한이 부여된다. 쓰기 영역이 활성화되면 공격자에 의해 악의적인 코드가 삽입될 수 있으므로 쓰기 권한은 없다.
데이터 세그먼트
-컴파일 시점에 값이 정해진 전역 변수, 전역 상수들이 위치한다. 변수 데이터는 읽을 수 있어야 하므로 당연히 읽기 권한이 부여된다.
이 때, 데이터 세그먼트는 쓰기 가능 영역과 불가능한 영역으로 나뉘는데, 변할 수 있는 글로벌 '변수'의 영역을 쓰기 가능한 영역인 data 세그먼트, 글로벌 '상수'는 변할 수 없기 때문에 읽기 불가능한 rodata 세그먼트(read-only data)영역으로 구분한다.
BSS 세그먼트
-컴파일 시점에 값이 정해지지 않은 전역변수가 위치한다. 선언만하고 초기화 시키지 않은 전역변수가 이곳에 해당하며, 프로그램이 시작될 때 모두 0으로 초기화 된다. 이 또한 변수를 읽고 쓸 수 있어야 하므로 읽기, 쓰기 권한이 부여된다.
그 외 힙은 힙데이터가, 스택은 프로세스의 스택이 위치하는 영역이다. 스택 영역도 cpu가 자유롭게 값을 읽고 쓸 수 있어야 하므로, 읽기와 쓰기 권한이 부여된다. 힙 영역도 읽기와 쓰기 권한이 부여된다.
굉장히 기본적이면서도 중요한 내용이기에 간단하게 리눅스 메모리 구조에 대해 정리해보았다.
참고자료