31_페이지 세그먼테이션(Segmentation)
메모리 관리에서 사용자가 바라보는 메모리 관점과 실제 물리적인 메모리의 관점을 분리되어 있다는 것은 매우 중요하다. 그렇다면 사용자는 메모리를 관리할 때 어떤 관점으로 바라보아야 하는가?
세그먼테이션(segmentation)은 사용자 관점 그대로 메모리를 관리하는 기법이다. 논리 구조 공간을 세그먼테이션 집합으로 정의하고 각 세그먼트는 이름과 길이를 가진다. 시스템에서는 논리 주소가 세그먼트 이름과 세그먼트 내에서의 변위로 나누어 진다.
사용자 프로그램이 컴파일 되면 컴파일러는 자동으로 입력 프로그램을 읽어 세그먼트들을 만들어 내며 구현을 쉽게 하기 위해 세그먼트 이름 대신 세그먼트 번호가 시스템에 의해 매겨진다. 따라서 논리주소는 <segment-number, offset>으로 구성 된다.
C에서 컴파일러는 다음과 같은 세그먼트를 생성한다. 컴파일 타임에 링크되는 라이브러리는 별도의 세그먼트에 할당 되어야 한다. 적재기는 이런 세그먼트 마다 번호를 매겨준다.
- 코드
- 전역변수
- 메모리 할당을 위한 힙(heap)
- 각각의 스레드를 위한 스택(stack)
- 표준 C 라이브러리
사용자는 세그먼트를 추가한 이차원 주소로 객체(obect)를 지정할 수 있지만 메모리는 바이트들의 일차원 구조이다. 그래서 사용자가 정의한 이차원 주소는 일차원 실제 주소로 매핑되어야 한다. 이 매핑은 시그먼트 테이블에 의해서 이루어진다.
세그먼트 테이블은 세그먼트 기준(base)과 세그먼트 한계(limit)를 가지고 있다. 세그먼트 기준은 세그먼트의 시작 주소를 나타내며 세그먼트 한계는 세그먼트의 길이를 명시 한다.
세그먼트 테이블의 논리 주소는 두 부분으로 구성 된다. 세그먼트 번호(s)와 세그먼트 내의 변위(offset, d)로 구성된다. 세그먼트 번호는 세그먼트의 색인으로 사용되며 변위(d)는 0과 세그먼트 크기 사이의 값이어야 한다. 그렇지 않을 경우 트랩이 발생 한다.
변위가 범위 안에 있으면 세그먼트 기준과 변위가 더해져서 원하는 바이트의 실제 주소가 얻어진다. 세그먼트 테이블은 기본적으로 베이스/한계 레지스터의 쌍으로 이루어진 배열이다.
- 베이스/ 한계 레지스터 : http://sqlmvp.kr/140191334564
[참고자료]
- Operating System Concepts / 홍릉과학출판사
- x86 memory segmentation : http://en.wikipedia.org/wiki/X86_memory_segmentation
'SW Engineering > OS Concept' 카테고리의 다른 글
33_가상 메모리 요구 페이징(Demand Paging) (0) | 2015.07.16 |
---|---|
32_가상 메모리(Virtual Memory) (0) | 2015.07.16 |
30_페이지 테이블 구조 (page table structure) (0) | 2015.07.16 |
29_메모리 페이징(2) (Paging) (0) | 2015.07.16 |
28_메모리 페이징 (Paging) (0) | 2015.07.16 |