Background : Linux Memory Layout

·2023년 1월 12일
0

System Hacking

목록 보기
1/10

리눅스 메모리 구조
: 프로세스 가상메모리의 각 구역이 어떤 정보를 담고 있는지 이해한다

세그먼트 (Segment)

적재되는 데이터의 용도별로 메모리의 구획을 나눈 것

1) 코드 세그먼트 (Code Segment) = 텍스트 세그먼트 (Text Segment)

: 실행 가능한 기계 코드가 위치한 영역 -> 읽기 권한, 실행 권한

int foo () { ... }

2) 데이터 세그먼트 (Data Segment)

: 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수가 위치 -> 읽기 권한

  • data 세그먼트 (쓰기 가능) : 프로그램이 실행되면서 값이 변할 수 있는 데이터들
    ex) 전역 변수
  • rodata (read-only data) 세그먼트 (쓰기 불가능) : 값이 변하면 안 되는 데이터들
    ex) 전역으로 선언된 상수
int data_num = 31337;                       // data
char data_rwstr[] = "writable_data";        // data
const char data_rostr[] = "readonly_data";  // rodata
char *str_ptr = "readonly";  // str_ptr은 data, 문자열은 rodata
int main() { ... }

str_ptr은 “readonly”라는 문자열을 가리키고 있는데, 이 문자열은 상수 문자열로 취급되어 rodata에 위치하며, 이를 가리키는 str_ptr은 전역 변수로서 data에 위치

int initialized_global = o;

3) BSS 세그먼트 (BSS Segment, Block Started By Symbol Segment)

: 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치 -> 읽기 및 쓰기 권한

여기에는 개발자가 선언만 하고 초기화하지 않은 전역변수 등이 포함됨
이 세그먼트의 메모리 영역은 프로그램이 시작될 때, 모두 0으로 값이 초기화되며 이런 특성 때문에 C 코드를 작성할 때, 초기화되지 않은 전역 변수의 값은 0

int bss_data;
int main() {
  printf("%d\n", bss_data);  // 0
  return 0;
}

위 코드에서 초기화되지 않은 전역 변수인 bss_data가 BSS 세그먼트에 위치

int uninitialized_global;

4) 스택 세그먼트 (Stack Segment)

: 프로세스의 스택이 위치하는 영역 -> 읽기 및 쓰기 권한
함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장됨

스택 프레임(Stack Frame)이라는 단위 사용
스택이 확장될 때, 기존 주소보다 낮은 주소로 확장되기에 '아래로 자란다' 표현을 사용하기도 함

void func() {
  int choice = 0;
  scanf("%d", &choice);
  if (choice)
    call_true();
  else
    call_false();
  return 0;
}

지역변수 choice가 스택에 저장됨

int foo () {int local = 0;}

5) 힙 세그먼트(Heap Segment)

: 스택과 마찬가지로 실행중에 동적으로 할당될 수 있으며, 리눅스에서는 스택 세그먼트와 반대 방향으로 자람 -> 읽기 및 쓰기 권한

C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치

int *ptr = malloc(4);

0개의 댓글