틀린 부분이 있다면 언제든지 댓글 남겨주세요!
Linux의 프로세스 메모리 구조는 5개의 세그먼트로 구분된다.
* 세그먼트: 적재되는 데이터의 용도별로 메모리의 구획을 나눈 것, 이렇게 용도별로 나누면 필요한 권한(읽기, 쓰기, 실행)을 부여할 수 있음
코드 세그먼트(Code Segment)
: (=텍스트 세그먼트) 실행 가능한 기계 코드 영역으로 프로그램을 동작하기 위해 코드 실행 > 읽기/쓰기 권한
>> int foo() {...} // 함수 코드
데이터 세그먼트(Data Segment)
: 컴파일 시점에 값이 정해진 전역 변수 및 상수 영역, 프로그램이 실행되면서 사용되는 데이터로 CPU는 이 곳의 데이터를 읽어서 실행됨 > 읽기 권한 (+쓰기)
>> int initialized_global = 0; // 초기화된 전역 변수 및 상수
- data segment: 쓰기 가능, 전역 변수같이 프로그램 실행 중 값이 변할 수 있음 ex) char data[]="asd";
- rodata(read only) segment: 쓰기 불가능, 전역 상수같이 실행 중 값이 변하지 않음 ex) const char data[]="asd";
* char *ptr="asd"; 의 경우 "asd" 문자열은 전역 상수로 rodata segment이지만, *ptr 변수는 전역 변수로 data segment에 해당
BSS 세그먼트(Block Started By Symbol Segment)
: 컴파일 시점에 값이 정해지지 않은 전역 변수 영역으로 선언하고 초기화 하지 않은 전역변수 등이 포함(프로그램 시작시 0으로 초기화 됨) > 읽기/쓰기 권한
>> int uninitialized_global; // 초기화되지 않은 전역 변수
힙 세그먼트(Heap Segment)
: 프로세스의 힙 영역, 프로그램 실행 중에 동적으로 할당되며 (현재 주소보다 높은 주소로 확장) > 읽기/쓰기 권한
>> int *ptr = malloc(); // malloc(), calloc() 등으로 동적 할당 된 메모리
스택 세그먼트(Stack Segment)
: 프로세스의 스택 영역, 함수의 인자(함수가 호출될 때 생성되고 반환될 때 해제됨)나 지역변수 같은 임시 변수 등이 프로그램이 실행되면서 저장되는데 사용자의 입력과 같은 여러 요인으로 인해 영역이 결정됨(현재 주소보다 낮은 주소로 확장, 힙 세그먼트와 반대 방향) > 읽기/쓰기 권한
>> int foo() {int local = 0;} // 지역 변수, 함수의 인자
*출처: Dreamhack 시스템해킹 강의
'OS > Linux' 카테고리의 다른 글
Git 연동 (Linux) (0) | 2023.06.24 |
---|---|
Ubuntu 공유폴더 설정 (0) | 2020.08.07 |
Ubuntu에서 pyenv사용하기 (0) | 2020.08.06 |
댓글