가장 일반적인 아키텍쳐인 80x86에서의 메모리 주소 체계를 다루도록 한다.

 

□ 메모리 주소

 

80x86에서는 다음과 같은 3가지 주소로 구별 된다.

 

1) 논리 주소 : 인텔의 세그먼트 구조를 체계화 한것이다.

 

2) 선형 주소(Linear address = Virtual address) : unsigned int 주소로 즉 32bit로 4GB, 즉 메모리 셀 4,294,967,296개 까지의 주소를 지정 할 수 있다. 선형 주소(Virtual Address)는 보통 16진수로 표기한다. 0x00000000 ~ 0xFFFFFFFF

 

3) 물리 주소 : 메모리 칩에 들어 있는 메모리 셀을 지정하는 데 사용하는 주소이다.

 

 

 

위 그림이 설명한 3개의 주소가 하드웨어 장치 Sementation unit과 paging unit을 이용해서 최종적으로 Physical address로 변환되는 과정을 그림으로 나타낸 것이다.

 

 

※ Memory arbiter

 

멀티 프로세서나 유니프로세서와 DMA간의 동시 메모리 접근을 맊기위한 중간에 중재를 해주는 장치이다. 이것은 하드웨어적으로 동작하기 때문에 프로그래밍 관점에서는 보이지 않는다. 

 

□ 하드웨어 세그멘테이션 

 

인텔은 286이상부터 Real ModeProtected Mode라는 서로 다른 두 가지의 방법으로 주소 변환을 하기 시작 하였다.

 

보호모드에서 주소 변환이 발생한다.

리얼 모드는 운영체제가 부팅할 수 있도록 하기 위함과 호환성을 위해서 남겨둔 것이다.

 

2.2.1. Segment Selectors and Segmentation Registers

 

논리 주소는 두 부분으로 나뉘어 진다.

 

1) Segment Selector : 16bit

2) offset : 32bit

 

위 그림이 Segment selector를 나타낸다.

 

 

Segmentation Register : 프로세서가 세그먼트 셀렉터를 빨리 읽기위한 목적으로 사용된다. 즉 세그먼트 셀렉터를 담는 목적인 것이다.

 

여기에는 cs, ss, ds, es, fs, gs가 있다.

위 중에서 3개는 특별한 용도가 있다.

 

cs ( code segment register ) : 프로그램 명령어를 담고 있는 세그먼트를 가리킨다. 추가로 CPU의 현재 특권 수준(CPL, Current Privilege Level)을 나타내는 2비트의 필드가 있다.

 

ss (stack segment register) : 현재 프로그램의 스택을 담고 있는 세그먼트를 가리킨다.

 

ds (data segment register) : 정적인 데이터와 전역 데이터를 담고 있는 세그먼트를 가리킨다.

 

 

Ring 0는 가장 높은 특권 수준을 Ring 3은 가장 낮은 수준을 나타낸다.

여기서 리눅스는 0과 3만을 사용하게 된다. 이것들은 각각 커널 모드(Kernel Mode)와 사용자 모드(User Mode)로 불리운다.

 

 

2.2.2 Segment Descriptors 세그먼트 디스크립터

 

세그먼트의 특징을 기술하는 8바이트 크기의 '세그먼트 디스크립터로 각 세그먼트를 표현 한다.

 

세그먼트 디스크립터는

 

Global Descriptor Table = GDT 또는

Local Descriptor Table = LDT에 저장 된다.

 

보통 GDT는 단 하나만 정의한다.

 

2.2.3 Fast Access to Segment Descriptors

 

앞서 논리 주소는 16비트 크기의 Segment Selectors와 32비트 크기의 offset으로 구성된다.

 

근대, 여기서 Segment Register에는 Segment Selector만 저장된다고 언급 하였다.

 

80x86 프로세서는 논리 주소를 선형 주소로 빠르게 변환하기 위하여 아래의 레지스터들을 제공한다.

 

프로그래밍이 가능한 레지스터 6개: cs, ss, ds, es, fs, gs

프로그래밍이 불가능한 레지스터(Nonprogrammable)

 

 

 

 

□ 리눅스에서의 세그멘테이션

 

세그멘테이션과 페이징이라는 개념은 둘 다 프로세스의 물리 주소 공간을 나누기 위한 개념이므로 중복되는 것이 다소 있다.

 

세그멘테이션 : 각 프로세스에 다른 선형 주소 공간을 할당 한다.

페이징 : 똑같은 선형 주소 공간을 다른 물리 주소 공간과 매핑 시킨다.

 

리눅스에서는 다음과 같은 이유로 세그멘테이션을 제한적으로 사용하며, 페이징을 널리 사용 한다.

 

1) 모든 프로세스가 동일한 세그먼트 레지스터 값을 가지면, 즉 모든 프로세스가 동일한 선형 주소 공간을 공유하면 메모리 관리가 더 간단해 진다.

 

2) 리눅스 설계의 목적 중 하나는 대중적인 다른 아키텍처와 호환하게 하는 것인데, RISC 아키텍처에서는 세그멘테이션을 매우 제한적으로 지원 한다.

 

따라서 리눅스 2.6 버전에서는 80x86 아키텍처가 필요로 하는 경우에만 세그멘테이션을 사용 한다.

 

 

 

 

 

'Computer Science > Linux Kernel' 카테고리의 다른 글

9장 프로세스 주소 공간  (0) 2012.06.08
8장 메모리 관리  (1) 2012.06.07

+ Recent posts