공부/JUN STUDY

BSS vs 데이터 vs rodata (전역영역 이름 구분하기)

JUNFUTURE 2022. 3. 30. 22:42

BSS / 데이터 / rodata 세그먼트 모두 전역변수/상수가 저장되는 위치이다.

일단 이거는 머리에 넣어두고

다만 어떤 전역변수/상수가 저장되느냐 인데, 이 글을 통해 살펴보자.

 

각 세그먼트마다 머리에 넣어두면 좋을 내용을 먼저 정리해보면

 

BSS 세그먼트 : 프로그램 시작시 모두 0으로 초기화됨 => 선언하고 초기화 하지않은 전역변수

데이터 세그먼트 : 프로그램 시작시 0으로 초기화 안됨 => 초기화된 전역변수/전역상수가 위치하는 영역. 

rodata 세그먼트 : 데이터 세그먼트 안에 수정 불가능한 영역 => 값이 변하면 안되는 데이터가 위치함. (문자열 / 전역상수) 

 

자 조금만 생각해보자.

전역변수를 선언하고 초기화를 하지 않았으면 프로그램을 실행하는 도중에 변수에 값을 넣어주는 과정이 필연적으로 있을 것이다. => 그래서 BSS영역에 읽기권한 뿐만아니라 쓰기권한까지 있는거고 무조건 전역 "변수"가 위치한다. (BSS 시작하자마자 다 0으로 초기화 되는데 이거 쓰려면 값을 넣어줘야하자나)

 

프로그램을 시작하는 시점에 값이 쓰여있어야하면 프로그램을 실행하는 도중에 값을 쓸 수도 안 쓸 수도있다. 컴파일 시점에서 결정된 값을 안바꾸고 계속쓰는 데이터의 경우. 그러니까 printf("Hello world!"); 할때 Hello world! 같은 문자열같은거. 이런건 프로그램이 실행되는 과정에서 변경될 필요가 전혀없다. 그래서

데이터 영역에 읽기쓰기권한이 모두 있는 영역이 있고 => for 초기화된 전역변수

데이터 영역에 읽기권한만 있는 영역이 있다. => rodata. for 전역"상수" (단순 문자열)

어찌되었던 초기화된 전역변수 / 전역상수 모두 프로그램이 시작하는 시점에 값이 유지되어야 하기때문에 데이터 세그먼트 영역에 들어간다.

 

데이터 vs rodata 세그먼트

데이터 세그먼트는 프로그램 시작시점에서 초기화된 전역변수들이 위치하는 영역이고,

그 영역안에 이제 읽기, 쓰기권한이 모두 있는 영역이 있고 읽기권한만 있는 영역이있다.

데이터 세그먼트 안에 읽기권한만 있는 영역이 바로 rodata 세그먼트이다. 

 

자 이렇게 글로만 보면 이해가 잘 안되는데, 드림핵 문제를 풀면서 보자

 

BSS 세그먼트 : 초기화 안된 전역변수 (int c;)

데이터 세그먼트 : 초기화된 전역변수(int a = 0xa;) / 전역상수 ("d_str")

rodata 세그먼트 : 변경할 필요가 없는 전역상수 ("d_str")