출처 | https://learn.dreamhack.io/52#1
Segment 세그먼트

세그먼트: 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것
리눅스에서는 프로세스 메모리를 크게 5가지의 세그먼트로 분류
↳ (1)코드 세그먼트, (2)데이터 세그먼트, (3)BSS 세그먼트, (4)힙 세그먼트, (5)스택 세그먼트
[1] Code Segment: 코드 세그먼트

code segment : 실행 가능한 기계 코드가 위치하는 영역 (= 텍스트 세그먼트 Text Segment)
프로그램이 동작하려면 코드를 실행할 수 있어야 하므로, 코드 세그먼트에는 읽기 권한(r) 과 실행 권한(e)이 부여됨
쓰기 권한(w)이 있으면 공격자가 악의적인 코드를 삽입하기가 쉬워지므로, 대부분의 현대 운영체제는 이 세그먼트에 쓰기 권한을 제거함
[2] Data Segment: 데이터 세그먼트

data segment : 쓰기(w)가 가능한 세그먼트
- 값이 변할 수 있는 데이터가 위치함: compile 시점에 초기화 된 전역변수 및 전역상수
rodata segment : 쓰기(w)가 불가능한 세그먼트 (read-only data segment)
- 값이 변하면 안 되는 데이터가 위치함: 전역으로 선언된 상수
[3] BSS Segment: BSS 세그먼트

BSS segment: 프로그램이 실행될 때, 값이 모두 0으로 초기화 되는 영역 (Block Started by Symbol Segment)
- 초기화되지 않은 전역변수가 위치함
[4] Stack Segment: 스택 세그먼트

stack segment: 프로세스의 스택이 위치하는 세그먼트
- 함수의 인자, 지역변수와 같은 임시 변수들이 실행 중에 스택에 저장됨
스택 세그먼트는 스택 프레임(Stack Frame)이라는 단위로 사용됨
스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제됨
💡 Stack Frame 스택 프레임이란?
스택은 함수별로 자신의 지역변수 또는 연산과정에서 부차적으로 생겨나는 임시 값들을 저장하는 영역
만약 이 스택 영역을 아무런 구분 없이 사용하게 된다면, 서로 다른 두 함수가 같은 메모리 영역을 사용할 수 있게 됨
따라서 함수별로 서로가 사용하는 스택의 영역을 명확히 구분하기 위해 스택프레임 사용
대부분의 Application binary interface(ABI)에서는 함수는 호출될 때 자신의 스택프레임을 만들고, 반환할 때 해제함
운영체제는 프로세스를 시작할 때, 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 스택을 확장함
스택이 동적으로 할당되며 확장될 때, 기존 주소보다 낮은 주소로 확장하며 아래 방향으로 커짐
CPU가 자유롭게 값을 읽고 쓸 수 있어야 하므로, 읽기(r)와 쓰기(w) 권한이 부여됨
[5] Heap Segment: 힙 세그먼트

heap segment: 힙 데이터가 위치하는 세그먼트
- C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 위치함
스택과 마찬가지로 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대로 위 방향으로 자람
일반적으로 읽기(r)와 쓰기(w) 권한이 부여됨
정리 및 결론

'👩🏻💻Coding > Architecture' 카테고리의 다른 글
| x86-64 Assembly Language 어셈블리어 (5) | 2024.10.09 |
|---|---|
| x86-64 아키텍처: 레지스터 (0) | 2024.10.08 |
| BIT, BYTE, WORD, DWORD, QWORD 정리하기 (1) | 2024.10.08 |
| OSI 7 Layer (1) | 2024.09.25 |