728x90

리눅스에서는 프로세스의 메모리를 크게 5가지의 세그먼트로 구분한다.

세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것인데, 크게
- 코드 세그먼트
- 데이터 세그먼트
- BSS 세그먼트
- 힙 세그먼트
- 스택 세그먼트
로 구분된다.

메모리에 대한 권한은 읽기, 쓰기, 실행이 존재한다.

 

/ 코드 세그먼트
- 실행 가능한 기계 코드가 위치하는 영역
- 텍스트 세그먼트(Text Segment)라고도 불린다.
- 읽기, 실행 권한이 부여되어있다.
- 쓰기 권한이 있다면 공격자가 악의적인 코드를 삽십하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거한다.
- 함수가 컴파일 되었을때 기계 코드로 변환되면 코드 세그먼트에 위치하게 된다.

/ 데이터 세그먼트
- 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치합니다.
- 읽기 권한이 부여된다. (CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로)
- 쓰기가 가능한 세그먼트와 쓰기가 불가능한 세그먼트로 분류된다.
- 쓰기가 가능한 세그먼트 :
    > data 세그먼트
    > 전역 변수와 같이 프로그램이 실행되면서 값이 변할 수 있는 데이터들이 위치한다.
- 쓰기가 불가능한 세그먼트 : 
    > rodata(read-only data) 세그먼트
    > 값이 변하면 안되는 데이터들이 위치합니다.
    > 전역으로 선언된 상수가 여기에 포함된다.

/ BSS 세그먼트
- 컴파일 시점에 값이 정해지지 않은 전역변수가 위치하는 메모리 영역이다.
- 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함된다.
- 프로그램이 시작될 때, 모두 0으로 값이 초기화된다.
- 이 세그먼트에는 읽기, 쓰기 권한이 부여된다.

/ 힙 세그먼트
- 힙 데이터가 위치하는 세그먼트이다.
- 스택과 마찬가지로 실행중에 동적으로 할당될 수 있다.
- 리눅스에서는 스택 세그먼트와 반대 방향으로 자란다고 표현한다.
- C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 된다.
- 일반적으로 읽기,쓰기 권한이 부여된다.

/ 스택 세그먼트
- 프로세스의 스택이 위치하는 영역이다.
- 함수의 인자지역 변수와 같은 임시 변수들이 실행중에 여기에 저장된다.
- 스택 세그먼트는 스택 프레임(Stack frame)이라는 단위로 사용된다.
- 함수가 호출될 때 생성되고, 반환될 때 해제된다.
- 특정 프로세스가 얼마 만큼의 스택 프레임을 사용하게 될 지 미리 계산하는것은 일반적으로 불가능하므로
운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해준다.
- 스택이 확장될 때 기존 주소보다 낮은 주소로 확장되기 때문에 '아래로 자란다'라는 표현을 사용한다.
- 읽기, 쓰기 권한이 부여된다.

 

 

 

728x90

+ Recent posts