세그먼트

  • 리눅스에서는 프로세스의 메모리 구조를 5개의 세그먼트로 구분
  • 코드, 데이터, BSS, 힙, 스택 의 세그먼트가 존재


코드 세그먼트

  • 실행 가능한 기계 코드가 위치하는 영역
  • 텍스트 세그먼트라고도 불림
  • 프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 읽기와 실행 권한이 부여
  • 쓰기 권한은 대부분 현대 운영체제에서 제거
  • 아래 메인 함수가 컴파일 되면 554889e5b8697a00005dc3라는 기계 코드로 변환되고, 이 기계 코드가 코드 세그먼트에 위치하게 됨
int main() { return 31337; }


데이터 세그먼트

  • 컴파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치
  • CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로 읽기 권한 부여
  • 데이터 세그먼트는 쓰기가 가능한 세그먼트와 쓰기가 불가능한 데이터로 분류
    • 전역변수같이 프로그램 실행 중 값이 변할 수 있는 데이터들이 위치하며, data 세그먼트라고 부름
    • 쓰기가 불가능한 세그먼트는 값이 변하면 안되는 상수가 포함, rodata(read-only data) 세그먼트라고 부름
char *str_ptr = "readonly";  // str_ptr은 data, 문자열은 rodata		


BSS 세그먼트

  • BSS의 약자는 Block Started By Symbol
  • 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
  • 개발자가 선언만 하고 초기화하지 않은 전역 변수 등이 포함
  • 이 세그먼트의 메모리 영역들은 모두 0으로 값이 초기화
  • 이 특성 때문에 C 코드를 작성할 때, 초기화되지 않은 변수의 값은 0이 됨
  • 읽기 및 쓰기 권한 부여


스택 세그먼트

  • 프로세스의 스택이 위치하는 영역
  • 함수의 인자나 지역 변수와 같은 임시 변수들 실행중에 여기에 저장
  • 스택 세그먼트는 스택 프레임 이라는 단위로 사용
    • 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제됨
  • 운영체제는 프로세스를 시작할 때 작은 크기의 스택 세그먼트를 먼저 할당해주고, 부족해 질 때마다 이를 확장해줌
  • 스택에 대해서 ‘아래로 자란다‘라는 표현을 사용, 이는 스택이 확장될 때 기존 주소보다 낮은 주소로 확장하기 때문
  • 이 영역은 CPU가 자유롭게 값을 읽고 쓸 수 있어야 하므로, 읽기와 쓰기 권한 부여


힙 세그먼트

  • 힙 데이터가 위치하는 세그먼트
  • 스택과 마찬가지로 실행중에 동적으로 할당될 수 있음
  • 리눅스에서는 스택 세그먼트와 반대로 자람
  • C언어에서는 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치
  • 읽기와 쓰기 권한 부여


요약

세그먼트 역할 일반적인 권한 사용 예
코드 세그먼트 실행 가능한 코드가 저장된 영역 읽기, 실행 main() 등의 함수 코드
데이터 세그먼트 초기화된 전역변수 또는 상수가 위치하는 영역 읽기와 쓰기 또는 읽기 전용 초기화된 전역 변수, 전역 상수
BSS 세그먼트 초기화되지 않은 데이터가 위치하는 영역 읽기, 쓰기 초기화되지 않은 전역 변수
스택 세그먼트 임시 변수가 저장되는 영역 읽기, 쓰기 지역 변수, 함수의 인자 등
힙 세그먼트 실행 중에 동적으로 사용되는 영역 읽기, 쓰기 malloc(), calloc()으로 할당받은 메모리

댓글남기기