Game Develop

[C++] 프로세스 메모리 세그먼트들 본문

C++/C++

[C++] 프로세스 메모리 세그먼트들

MaxLevel 2022. 11. 19. 02:16

 

 

Text 세그먼트(혹은 Code 세그먼트)는 일반적으로 변하지 않는 영역이고, 변하지 않아야하는 영역이다.

그래서 ReadOnly 영역이며, 그렇기 때문에 리터럴값들이 여기에 저장될 수도 있는듯 하다.

위 이미지에선 리터럴값이 rodata(.rdata)에 저장되어진다고 나와있는데, 숱한 구글링을 통해 지식들을 취합해본 결과, 

컴파일러에 따라 rodata 세그먼트일 수도 있고, Text세그먼트일 수도 있다고 한다.

 

Data 세그먼트(.data)는 보통 초기화된 전역변수나 정적변수가 들어있다고 한다.

거기서 좀 더 쪼개자면, '초기화된 읽기전용 영역'과 '초기화된 읽기-쓰기 영역'으로 나눌 수 있다.

아래 두 변수가 전역이라는 가정하에

 

// 전역변수

const char* cp = "maxlevel";  // 초기화된 읽기전용 영역에 "maxlevel" 저장.

char ca[9] = "maxlevel";         // 초기화된 읽기-쓰기 영역에 "maxlevel"에 저장.

 

이라고 볼 수 있다.

 

BSS 세그먼트(.bss)는 초기화되지 않은 데이터세그먼트이다. Block Started by Symbol의 줄임말이라고 한다.

프로그램의 실행과 함께, 커널(스타트업 코드)에 의해 0으로 초기화된다.

int i; 같이 초기화되진 않은 전역변수들을 포함한다.

 

그리고 위의 이미지에 보면 const라는 세그먼트의 값을 DATA 세그먼트에 복사한다고 되어있는데 해당부분에 대해 설명하자면, Data세그먼트는 초기화된 전역변수나 정적변수를 포함한다고 했다.

그 초기화시키기 위한 값자체는, 미리 위의 이미지처럼 ROM or Flash에 배치되어있는 rodata세그먼트나 Const세그먼트에 값이 초기화되고 그 값을 Data세그먼트에 복사해서 Data세그먼트의 전역변수의 값들을 초기화시키는것이다.

 

 

그리고 왜 이렇게 세그먼트단위로 나눠서 관리할까??? 라는 의문에 대해서는, 아래 추가한 다른 분의 글을 참고하는걸 추천한다. 

https://embeddedchallenge.tistory.com/458

 

mcu memory, section에 대한 상세 정리 (.text, .data, .bss, .rodata)

안녕하세요. 오늘은 MCU 개발을 하는 과정에서 memory와 section에 대해 궁금해 하시는 분들이 많이 있으신데요. 이 부분에 대해서 한번 알아 보는 시간을 가지도록 하겠습니다. 먼저 section의 사전적

embeddedchallenge.tistory.com

 

쉽게 설명하셨는데 요약하자면,

RAM에 올리는것들은 read-write해야하기 때문이고, 리터럴값들 같은것은 read만 하는 값들이기때문에 굳이 공간부족한 RAM에 올릴필요없이 ROM에 저장하는 것..이라고 생각한다.