리눅스 프로세스 메모리 구조
리눅스 프로세스의 메모리는 크게 5가지 세그먼트로 구분된다.
1. 코드 세그먼트 2. 데이터 세그먼트 3. BSS 세그먼트 4. 힙 세그먼트 5. 스택 세그먼트 |
1. 코드 세그먼트
실행 가능한 기계코드가 위치하는 영역
부여 권한 : 읽기, 쓰기
int main() { return 31337; }
위와 같은 함수를 실행시켰을 때 "554889e5b8697a00005dc3" 라는 기계코드로 변환되고
해당 기계코드가 위치하는 장소가 코드 세그먼트이다.
2. 데이터 세그먼트
컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역
부여 권한 : 읽기, 쓰기
데이터 세그먼트는 data 세그먼트와 rodata 세그먼트로 나뉜다.
값이 변할 수 있는 데이터들이 위치하는 data세그먼트와
값이 변하면 안되는 데이터들이 위치하는 rodata 세그먼트로 나뉜다.
즉, data 세그먼트에는 쓰기권한이 주어지고, rodata 세그먼트에는 주어지지 않는다.
3. BSS 세그먼트
컴파일 시점에 값이 정해지지 않은 전역 변수가 위차하는 영역
부여 권한 : 읽기 쓰기
int no_data;
int main() {
printf("%d\n", no_data); // 0
return 0;
}
위와 같은 코드가 있을 때 "no_data"의 값이 아직 정해지지 않았기 때문에
BSS 세그먼트에 위치하게 된다.
4. 스택 세그먼트
프로세스의 스택이 위치하는 영역
부여 권한 : 읽기, 쓰기
void func() {
int value = 0;
int price;
scanf("%d", &value);
if (value)
price = 1,000;
else
price = 0;
return 0;
}
위의 코드를 보면 사용자가 입력한 "value" 값에 따라 "price" 변수의 값이 달라지므로
해당 프로세스가 얼마만큼의 스택 프레임을 사용하게 될 지를 미리 계산하는것은 불가능하다.
따라서 운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 할당해주고, 부족할 때마다 이를 확장해준다.
5. 힙 세그먼트
힙 데이터가 위치하는 영역
부여 권한 : 읽기 쓰기
세그먼트 | 정의 | 부여되는 권한 |
코드 세그먼트 | 실행 가능한 기계코드가 위치하는 영역 | 읽기, 쓰기 |
데이터 세그먼트 | 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치하는 영역 | 읽기, 쓰기(data 세그먼트) |
BSS 세그먼트 | 컴파일 시점에 값이 정해지지 않은 전역 변수가 위차하는 영역 | 읽기, 쓰기 |
스택 세그먼트 | 프로세스의 스택이 위치하는 영역 | 읽기, 쓰기 |
힙 세그먼트 | 힙 데이터가 위치하는 영역 | 읽기, 쓰기 |
'시스템 보안 > 이론' 카테고리의 다른 글
[System] x86 Assembly (0) | 2023.05.01 |
---|---|
[System] 컴퓨터 아키텍처 (0) | 2023.05.01 |
[System] x86, x64 레지스터, BoF 란 무엇인가? (0) | 2023.03.20 |
[System] .so .a .o .c 이란 무엇인가? (0) | 2023.03.14 |
[System] dll 파일이란 무엇인가? (0) | 2023.03.14 |