Memory Layout

‍김상빈·2023년 9월 28일
0

computer_architecture

목록 보기
3/6
post-thumbnail

오늘은 Memory Layout에 대해서 이야기 해볼 것이다.

Linux process에서의 메모리는 5가지의 Segment 즉 영역으로 나눌 수 있다.

  1. Code Segment(Text Segment)
  2. Data Segment
  3. BSS Segment
  4. heap Segment
  5. stack Segment

여기서 Segment는 적재되는 데이터 용도별로 영역을 나눠 적재 시키려고 만든 것이다. 이를 Segmentation이라고 한다.

x86-64에서는 Segmentation 기법을 사용하지 않고 flat memory model를 사용한다.
이는 Segment로 나누지 않고 하나의 메모리 블록을 이용해서 process의 데이터와 같이 저장해야하는 걸 저장한다.

이제는 위에서 이야기한 5가지의 segment에 대해서 이야기 해보려고 한다.

Code Segment(Text Segment)

프로그램이 실행되려고 코드와 데이터가 메모리에 load가 될 때 실행 가능한 명령어 코드를 포함하는 Segment를 말한다. 그래서 CPU가 실행 가능한 명령어들을 포함하고 있다.
보편적으로 이 Segment에는 읽기 권한와 실행 권한을 갖고 있기 때문에 바이너리를 실행하는 도중에 변경이 불가능 하다. 그 이유는 쓰기 권한이 없기 때문이다.
그리고 같은 라이브러리를 이용한다면 code segment를 공유할 수가 있다.

Data Segment

컴파일 시점에 값이 정해지는 global 변수 및 상수들이 Data Segment에 포함이 된다. Static 변수도 포함이 된다. 제일 중요한 부분은 변수에 값이 초기화가 된 상태라는 것이다. 초기화가 되지 않으면 다른 Segment에 저장이 된다.

바이너리가 종료 될 때까지 값을 저장시키며 운영체제에 의해 메모리가 할당 된다. 그리고 읽기만 가능한 데이터와 읽기와 쓰기가 가능한 데이터가 있다. 예를 들면 const int a = 5;와 같은 데이터는 읽기만 가능하며 쓰기는 안된다.

BSS(Block Started By Symbol Segment) Segment

컴파일 시점에서 값이 지정되지 않은 전역 변수를 저장하는 Segment를 말한다. 이 영역에 저장되어 있는 변수들은 자동으로 0으로 초기화 시킨다. 쓰레기 값이 들어 있으면 용량을 많이 잡아먹을 수 있기 때문에 0으로 초기화 시킨다. 프로그램 전체에서 이 영역에 접근이 가능하며 이 Segment는 읽기와 쓰기 권한이 부여된다.

Stack Segment

함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장이 된다. 스텍은 후입선출로 나중에 push된게 먼저 나가는 방식을 정한다.

스택 세그먼트는 스택 프레임(Stack Frame)이라는 단위로 사용된다. 스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제된다.

나중에 더 설명할 것이지만 함수를 호출하면 하나의 스택 프레임이 생성되고 그 함수에서 다른 함수를 또 호출하면 그 위에 또 스택 프레임이 쌓여 올려준다. 그리고 함수가 끝나면 기존의 스택 프레임으로 돌아간다. 제일 중요한 건 함수가 호출 될 때 주로 스택 프레임이 생성된다는 것이다.

더 자세한 스택 프레임 이야기는 다음 시간에 더 자세히 이야기 해보려고 한다.

Heap Segment

Heap 데이터가 위치하는 영역이다. 여기에서는 힙에 대한 이해가 필요 함으로 다음 시간에 자세히 다루어 보도록 하겠다.

요약 사진

profile
nickname: pwn_newbe

0개의 댓글