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 |