드림핵

리눅스 메모리 구조 (Memory Layout)

다다x_x 2025. 3. 10. 09:27

프로세스 가상메모리의 각 구역이 어떤 정보가 저장되어있는가?

세그먼트 (Segment)

  • 적재되는 데이터의 용도별로 메모리의 구획 분리
  • 코드 세그먼트, 데이터 세그먼트, BSS 세그먼트, 힙 세그먼트, 스택 세그먼트로 구분

코드 세그먼트 (Code Segment)

  • 기계 코드가 위치
  • 텍스트 세그먼트 (Text Segment)
  • 읽기 권한, 실행 권한 부여
    • 악의적 코드 삽입 방지를 위해, 쓰기 권한 제한

데이터 세그먼트 (Data Segment)

  • 컴파일 시점에 값이 정해진 전역 변수, 전역 상수
  • 읽기 권한 부여
    • 실행되면서 값이 변경 가능한 데이터들이 위치 -> data 세그먼트 (쓰기 가능)
    • 실행되면서 값이 변경 불가능한 데이터들이 위치 -> rodata(read-only data) 세그먼트
    • 포인터로 선언한 문자열 변수에서 문자열은 상수 문자열 (rodata), 변수는 전역 변수 (data )

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

  • 컴파일 시점에 값이 정해지지 않은 전역 변수 (선언O, 초기화X)
  • 프로그램이 시작될 때, 모두 0으로 초기화
  • 읽기 권한, 쓰기 권한 부여

스택 세그먼트 (Stack Segment)

  • 프로세스의 스택이 위치
  • 함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장
  • 스택 프레임(Stack Frame) 이라는 단위로 사용 (함수가 호출될 때 생성되고, 반환될 때 해제)
  • 실행중에 동적 확장 (기존 주소보다 낮은 주소로 확장)
  • 읽기 권한, 쓰기 권한 부여

힙 세그먼트 (Heap Segment)

  • 힙 데이터가 위치
  • 실행중에 동적 할당 (기존 주소보다 높은 주소로 확장)
  • C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리
  • 읽기 권한, 쓰기 권한 부여

 

참조

https://learn.dreamhack.io/52