Windows 운영체제에서 프로그램이 접근하는 메모리는 가상 메모리이며 가상메모리의 내용을 물리적 메모리에 쓰거나 읽는 과정은 80x86 인텔 프로세서에서 지원하는 Segmentation과 Paging 과정에 의해서 이다.
이번 장에서는 두가지 내용 중 Segmentation 내용에 대해 알아보도록 하겠다.
1. Segmentation
Segmentation이란 마이크로프로세서에서 명시적 혹은 암시적으로 지시되는 세그먼트 레지스터와 사용자가 지정한 메모리(가상 메모리)를 조합하여 Linear Address를 생성하는 과정을 말한다.
그림 1을 보면 간단한 원리를 알 수 있다.
세그먼트 레지스터와 가상 논리 주소를 통해 얻어지는 주소는 Linear Address이다.
이렇게 얻어진 Linear Address로부터 인텔80x86 페이징 메커니즘을 통해 실제 물리적인 주소를 얻어오게 된다.
그럼 각각의 요소에 대해 알아보도록 하겠다.
2. Segment Register
세그먼트 레지스터는 Segment Descriptor의 위치정보를 가지고 있다.
그림 2에서 보는바와 같이 Segment Register에 대한 구조가 나와있다.
Index는 13 bit 이며 가리킬 Segment Descriptor에 대한 정보를 가지고 있다.
TI는 향후 배울 Descriptor Table의 종류를 의미한다.
(0 : GDT, 1 : LDT)
이런 Segment Register가 하는 역할은 간단하다 Index 부분에 사용하고자하는 Segment Descriptor의 정보가 들어가게 된다.
그래서 Segment Register를 다른 말로 Selector라고 하는 것이다.
3. Descriptor Table
Descriptor Talbe은 Segmentation Descriptor를 모아놓은 Table이다.
이런 Descriptor Table은 다음과 같이 두 종류의 Table로 구성되어 있다.
GDT - 모든 프로그램이 참조할 수 있는 세그먼트 디스크립터들의 모임이며 운영체제 제작 시 반드
시 만들어 줘야하는 Descriptor Table이다.
LDT - 멀티 태스킹 환경에서 각 태스크 단위로 정의할 수 있는 것이며 운영체제 제작 시 반드시
만들어 줄 필요는 없다.
이런 Descriptor Table의 시작 위치를 가지고 있는 레지스터가 존재하는데 GDTR과 LDTR이다.
해당 레지스터 들은 용도가 틀리며 자세한 내용은 해당 레지스터에 대해 검색하기 바란다.
4. Segment Descriptor
그럼 위에서 언급된 Segment Descriptor는 무엇인가 하는 의문이 들 것이다.
Segment Register는 그림 2와 같이 16 bit 밖에 되지 않기 때문에 시스템 보호에 대한 다양한 정보를 가지고 있을 수 없다.
이런 보호 정책을 가지고 있는 것이 Segment Descriptor이다.
Descriptor에는 다양한 정보를 가지고 있으며 해당 보호 정보들에 따라 마이크로프로세서에서 제공하는 다양한 보호모드의 기능을 사용할 수 있게 된다.
단, Segment Descriptor를 통해 향후 배울 윈도우에서 관리하는 커널 모드의 메모리를 보호하지는 않는다.
Paging에서 접근 허용하지 않게 Paging Table Entry를 구성하여 커널 모드의 메모리에 유저 모드에 해당하는 요청이 수행되지 않게 된다.
5. 종합
위의 내용과 같이 Segmentation은 마이크로프로세서에 내재되어 있는 Register들에 의해 생성되는 Base Address와 개발자가 지정한 주소를 합하여 Linear Address를 만드는 과정이며 여기서 생성된 Linear Address는 향후 다음 장에서 설명할 Paging을 통해 실제 Physical Address에 적재되어 사용되어 지게 된다.
이번 장에서는 두가지 내용 중 Segmentation 내용에 대해 알아보도록 하겠다.
[그림 1] Segmentation
1. Segmentation
Segmentation이란 마이크로프로세서에서 명시적 혹은 암시적으로 지시되는 세그먼트 레지스터와 사용자가 지정한 메모리(가상 메모리)를 조합하여 Linear Address를 생성하는 과정을 말한다.
그림 1을 보면 간단한 원리를 알 수 있다.
세그먼트 레지스터와 가상 논리 주소를 통해 얻어지는 주소는 Linear Address이다.
이렇게 얻어진 Linear Address로부터 인텔80x86 페이징 메커니즘을 통해 실제 물리적인 주소를 얻어오게 된다.
그럼 각각의 요소에 대해 알아보도록 하겠다.
2. Segment Register
세그먼트 레지스터는 Segment Descriptor의 위치정보를 가지고 있다.
[그림 2] Segment Register
그림 2에서 보는바와 같이 Segment Register에 대한 구조가 나와있다.
Index는 13 bit 이며 가리킬 Segment Descriptor에 대한 정보를 가지고 있다.
TI는 향후 배울 Descriptor Table의 종류를 의미한다.
(0 : GDT, 1 : LDT)
이런 Segment Register가 하는 역할은 간단하다 Index 부분에 사용하고자하는 Segment Descriptor의 정보가 들어가게 된다.
그래서 Segment Register를 다른 말로 Selector라고 하는 것이다.
3. Descriptor Table
Descriptor Talbe은 Segmentation Descriptor를 모아놓은 Table이다.
이런 Descriptor Table은 다음과 같이 두 종류의 Table로 구성되어 있다.
GDT - 모든 프로그램이 참조할 수 있는 세그먼트 디스크립터들의 모임이며 운영체제 제작 시 반드
시 만들어 줘야하는 Descriptor Table이다.
LDT - 멀티 태스킹 환경에서 각 태스크 단위로 정의할 수 있는 것이며 운영체제 제작 시 반드시
만들어 줄 필요는 없다.
이런 Descriptor Table의 시작 위치를 가지고 있는 레지스터가 존재하는데 GDTR과 LDTR이다.
해당 레지스터 들은 용도가 틀리며 자세한 내용은 해당 레지스터에 대해 검색하기 바란다.
4. Segment Descriptor
그럼 위에서 언급된 Segment Descriptor는 무엇인가 하는 의문이 들 것이다.
Segment Register는 그림 2와 같이 16 bit 밖에 되지 않기 때문에 시스템 보호에 대한 다양한 정보를 가지고 있을 수 없다.
이런 보호 정책을 가지고 있는 것이 Segment Descriptor이다.
[그림 3] Segment Descrptor
Descriptor에는 다양한 정보를 가지고 있으며 해당 보호 정보들에 따라 마이크로프로세서에서 제공하는 다양한 보호모드의 기능을 사용할 수 있게 된다.
단, Segment Descriptor를 통해 향후 배울 윈도우에서 관리하는 커널 모드의 메모리를 보호하지는 않는다.
Paging에서 접근 허용하지 않게 Paging Table Entry를 구성하여 커널 모드의 메모리에 유저 모드에 해당하는 요청이 수행되지 않게 된다.
5. 종합
위의 내용과 같이 Segmentation은 마이크로프로세서에 내재되어 있는 Register들에 의해 생성되는 Base Address와 개발자가 지정한 주소를 합하여 Linear Address를 만드는 과정이며 여기서 생성된 Linear Address는 향후 다음 장에서 설명할 Paging을 통해 실제 Physical Address에 적재되어 사용되어 지게 된다.