티스토리 툴바

BLOG main image
분류 전체보기 (44)
세상사는이야기 (6)
내 컴퓨터 (7)
행복을 위해 (1)
긁적긁적 (4)
끄적끄적 (9)
리눅스^^ (4)
자바^^ (5)
Oracle (6)
개발자론 (0)
projecteuler.net (2)
객체지향 (0)
8,278 Visitors up to today!
Today 0 hit, Yesterday 6 hit
daisy rss
tistory 티스토리 가입하기!
2011/08/16 01:36

Protected 모드로 진입을 위한 Global Descriptor Table 등록을 위한



Base Address : 이 세그먼트의 시작 주소, 물리주소로 하위 16비트, 상위 16비트
Limit : 세그먼트의 한계점, 만약 넘어간다면 GP fault(Protected Mode 규약 위반) 이 발생한다. 20비트
G비트 : 0이면 세그먼트의 크기를 바이트 단위로 하며, 1이면 4KB 단위로 한다.
         : 만약 Limit 이 0xFFFFF 이고, G비트가 1일때 0xFFFFF x 0xFFF = 0xFFFFFFF (4GB) 영역을 갖는다.
P비트 : 메모리 존재여부, 메모리 관리 루틴으로 사용됨, 페이징 기능과 관련됨, 처음에는 1로 set 한다.
DPL비트 : 2비트 커널, 유저레벨인지를 나타낸다. x86계열 CPU에서는 0 ~ 3레벨만 사용한다. DPL 값이 0일때
 커널을 3일때 유저레벨을 타나낸다.
S비트 : 세그먼트가 시스템(0), 코드 혹은 데이터(1) 세그먼트를 지정한다.
D비트 : 이 세그먼트가 16비트인지 32비트인지를 표현한다.

Type : 4비트로 구성됨 아래와 같다.


마지막 A 비트는 어떤 프로그램이 이 세그먼트에 접근했을 때 CPU가 이곳을 찾아 A 비트를 1로 바꿔줍니다.
그러나 CPU는 이 비트를 0으로 클리어해 주지는 않습니다. 커널은 메모리 관리시 이 비트가 1이 되었는지 조사 또는 액세스된 세그먼트 디스크립터를 찾아 이 A 비트를 어느 시간이 지나면 0으로 하거나 하는일을 수행한다.

첫번째 비트는 : 데이터 또는 코드일때를 뜻한다.
두번째 E 비트 : 데이터 비트일때 EXPAND DOWN 또는 EXPAND UP를 뜻한다. 이는 세그먼트를 스택으로 
사용할때 동적으로 변하도록 만들기 위한 장치이다.
이 비트가 1일때 프로그램도중 세그먼트의 Limit 값을 바꾸면 스택의 제일 밑에 스택 공간이 추가된다.

스택을 위한 세그먼트는 항상 데이터 세그먼트여야 하고, 읽기/쓰기 모두 가능해야 한다. 프로그램 실행중
쓰기가 불가능한 세그먼트를 스택으로 사용한다면, 즉 SS 레지스터에 쓰기가 불가능한 데이터 세그먼트를로드할때 #GP 폴트가 발생한다.


GDT 등록시 첫번째 디스크립터는 형식상 항상 NULL 디스크립터를 기재해야 한다.


CPU의 GDTR 레지스터(48비트) 
      [16비트 GDT의 크기][GDT의 시작점 주소 32비트] 를 등록한다.

nasm에서 lgdt명령 및 gdtr의 주소를 인자로 gdtr레지스터에 48비트를 등록한다.  
아래는 만들면서 배우는 OS커널 의 구조와 원리 예제의 한부분이다.


질문 : 만들면서 배우는 OS 커널 의 구조와 원리에서 Protected 모드 전환을 하기위해 GDT(Global Descriptor Table)를 등록하는데 16비트에서 ->32비트로 변경한다. 하지만 GDT 의 D 플래그는 세그먼트가 16비트인지 32비트인지를 판단한다. 그렇다면 16비트 머신에서도 Protected 모드로 전환이 가능한것인가? 

질문 : 또한 Offset를 최대로 했을때 4GB 까지 할수 있다. Base Address가 32비트로 표현이 가능하다.
         Base Address로부터 4GB까지 메모리 할당이 가능하다는것인데..
         그렇다면 64비트 머신에서의 GDT는 형태가 다른가?
 
저작자 표시 비영리 변경 금지
prev"" #1 #2 #3 #4 #5 ... #44 next