본문 바로가기

Ping!_linux

2. 리눅스 메모리 구조 (Linux Memory Layout)

1. 세그먼트 : 프로세스 메모리 세그먼트로 구분

세그먼트란 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것

1) 코드 세그먼트, 2) 데이터 세그먼트, 3)BSS 세그먼트, 4)힙 세그먼트, 5)스택 세그먼트

 CPU는 메모리에 대해 권한(읽기/쓰기/실행)이 부여된 행위만 할 수 있음

ㅇ 코드 세그먼트 ( 텍스트 세그먼트라고도 불림)
: 실행 가능한 기계 코드가 위치하는 영역

프로그램이 동작하려면 코드를 실행할 수 있어야 하므로 이 세그먼트에는 읽기 권한 과 실행 권한 이 부여
BUT, 쓰기 권한은 악의적 코드 삽입 쉬워지므로 , 대부분 운영체제는 이 세그먼트에 쓰기 권한 제거

 

 

 

ㅇ 데이터 세그먼트(Data Segment)
파일 시점에 값이 정해진 전역 변수 및 전역 상수들이 위치

CPU가 이 세그먼트의 데이터를 읽을 수 있어야 하므로, 읽기 권한 이 부여

쓰기가 불가능한 세그먼트에는 프로그램이 실행되면서 값이 변하면 안되는 데이터들이 위치
전역으로 선언된 상수가 여기에 포함된다. 이런 세그먼트를 rodata(read-only data) 세그먼트

 

ㅇBSS 세그먼트
: 컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역. (초기화하지 않은 전역변수 등이 포함)


프로그램이 시작될 때, 모두 0으로 값이 초기화 됌 ( ex C코드 작성시 초기화되지 않은 전역 변수의 값:  0)
이 세그먼트에는 읽기 권한 및 쓰기 권한이 부여

 

ㅇ 스택 세그먼트
: 프로세스의 스택이 위치하는 영역
함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 여기에 저장됌

- 스택 세그먼트는 스택 프레임이라는 단위로 사용됌
스택 프레임은 함수가 호출될 때 생성되고, 반환될 때 해제됌
BUT프로그램의 전체 실행 흐름은 사용자의 입력을 비롯한 여러 요인에 영향을 받음

 

 

 

 

ㅇ 힙 세그먼트
: 힙 데이터가 위치하는 세그먼트

 스택과 마찬가지로 실행중에 동적으로 할당될 수 O,
리눅스에서는 스택 세그먼트와 반대 방향으로 자f람
 C언어에서 malloc(), calloc() 등을 호출해서 할당받는 메모리가 이 세그먼트에 위치하게 되며
일반적으로 읽기와 쓰기 권한이 부여된다.

 

 

 

!! 힙과 스택 세그먼트가 자라는 방향이 반대인 이유

 두 세그먼트가 동일한 방향으로 자라며, 연속된 메모리 주소에 각각 할당된다고 가정->

기존의 힙 세그먼트를 모두 사용하고 나면  확장하는 과정에서 스택 세그먼트와 충돌하게 됌

::: 해결하기 위해 리눅스는 스택을 메모리의 끝에 위치시키고, 힙과 스택을 반대로 자라게 함

-> 힙과 스택은 메모리를 최대한 자유롭게 사용할 수 있고 충돌 문제로부터도 비교적 자유롭게 됌

 

 

 

 

 

'Ping!_linux' 카테고리의 다른 글

Python 기초 문법 (2)  (3) 2024.03.16
Python 기초 문법 (1)  (1) 2024.03.15
기본 명령어 및 vi 에디터  (0) 2024.01.28
3. x86 Assembly  (0) 2024.01.28
1. 컴퓨터구조  (0) 2024.01.28