반응형

이 설명은 리눅스 기준으로 설명된다. 오른쪽 이미지가 리눅스의 각 메모리 영역을 의미하며, Text,Rodata,data,BSS,Heap, Stack을 차례로 설명하겠다.

 

1. Text 영역 (code 영역) 

1. 우리가 작성한 코드가 컴파일 된후 기계어로 번역되어 저장되어있는 곳이다.

2. 오직 읽기 전용이다. 

3. %eip를 통해 읽어서 코드가 실행된다.

4. 프로그램이 끝날때까지 메모리에 남아있다. 

 

2. Rodata 영역

1. Rodata는 해석하면 Read only data로, 읽기전용인 data들이 들어간다.

2. 주로 상수, 상수형 문자열, printf의 중괄호 부분이 들어간다. 

3. 오직 읽기 전용이다. 

3. Data 영역과 bss 영역

1. data영역과 bss영역은 매우비슷한데, 일단 둘다 전역 변수(전역 배열, 전역 구조체 포함)등을 저장하는건 동일하다.

2. 정적변수(Static) 역시 여기저장된다. (해석하면 Static 변수는 프로그램 시작과 동시에 만들어지긴 한다)

3. bss영역은 초기화 하기 전의 전역변수를 저장하고, data영역은 초기화 한 전역변수를 저장한다. (값 저장 유무)

4. 전역변수들은 main이 실행되기전 저장되며, bss영역에 있던 전역변수는 main이 실행되기전, 전부 0으로 초기화되어 data영역으로 들어가버린다. (우리의 전역배열, 전역변수가 0으로 초기화되던 이유)

이럴거면 bss가 왜 필요하냐고 할 수 있는데, 여러프로그램을 다루는 경우, 초기화 안된거는 main실행전 메모리를 아끼는게 중요할때가 있다. 

5. 이부분은 읽기 쓰기 모두 허용된다. (전역변수 값은 바꿔야 할거 아닌가)

 

4. Stack 영역

1. 지역변수와 매개변수가 저장된다. (매개변수는 register에 저장될 수도 있다.)

2. 지역변수와 매개변수의 규칙과 같이, 함수가 선언되면 할당되고, 끝나면 해제된다. (%rsp이용)

3. 할당과 해제를 계속 반복하여, 사이즈가 계속적으로 변한다. 

4. 메모리의 높은주소에서 낮은주소로 할당된다. (위 이미지의 아래쪽이 높은 주소임) 

 

5. Heap 영역

1. 동적할당하는 파트이다. (C언어 기준 malloc)

2. 메모리의 낮은 주소에서 높은 주소로 할당되며, 동적할당에서 나오듯이 직접 할당, 해제해야한다.

3. 사실상 스택과 같은 영역을 공유한다. (이미지에서 알 수 있듯, Heap과 Stack의 합은 정해져 있음)

4. 만약 스택과 힙이 겹칠경우, 마지막에 할당한 것에서 이름을 따서 stack overflow, heap overflow가 발생한다. (프로그래머들 머리 깨지게 만드는 주범들중 하나)

 

 

반응형

'프로그래밍 구조' 카테고리의 다른 글

2차원 배열과 pointer  (0) 2021.11.05
C언어 전처리기  (0) 2021.10.08
fgets 사용법, 주의점  (0) 2021.10.06
리눅스 명령어 정리(주요)  (0) 2021.09.22
C언어 전역,지역변수 static, extern, auto 정리  (0) 2021.09.12

+ Recent posts