2011-07-30 3 views
6

각 프로세스마다 별도의 로컬 디스크립터 테이블을 사용할 작은 OS에서 작업하고 있습니다. 내 GDT에서 LDT 세그먼트를로드하려면 lldt 명령어를 사용해야 함을 이해합니다. 나는 이미 유효한 GDT로 보호 모드에서 커널을 실행시키고 있지만, LDT에 대한 GDT 항목이 어떻게 생겼는지 알 수 없다. 기본 주소가 내 LDT를 가리켜 야한다는 것을 이해하지만 권한 수준 및 기타 특성이 무엇인지 잘 모릅니다. 여기 내 GDT의 LDT 항목을 나타내는 NASM 코드 :LLDT 사용 및 GDT 구성하기

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x89       ; probably incorrect... 
db 0x1f       ; possibly incorrect... 
db 0x0 

당신이 NASM 구문에 익숙하지 않은 경우는,이 ​​테이블 항목은 0x8000을 기본 주소 및 (511)의 한계 (512 바이트의 총을 가지고 또는 64 항목). 필자는 i486 프로그래머 참조 설명서에서 GDT 및 LDT에 대한 섹션을 읽었지만 내 GDT 항목의 모양을 완전히 이해할 수는 없습니다.

어쨌든, 그래서 같은 LDT를로드

mov ax, 0x20 
lldt ax 

이 코드는 (I 인터럽트로 처리) 일반 보호 오류를 생성하는 프로세서가 발생합니다. 두 가지를 알고 싶습니다.

1) GDT에 정확하게 LDT를 기술 했습니까? 그렇지 않다면 무엇을 변경해야합니까? 2) LDT 자체에 유효하지 않은 선택자가 있기 때문에 LLDT 명령이 실패 할 수 있습니까? 나는 LLDT 명령어 스펙을 읽었고, LDT의 메모리를 읽지도 않는 것 같지만 LDT의 데이터에 오타가 있기 때문에 LLDT가 실패하지 않았는지 확인하고 싶다.

답변

3

좋아, 알아 냈어. 내가 사용하고있는 타입 (1001b)은 내가 필요한 것이 아닙니다. LDT 항목에 유형 2 (10b)가 사용 된 것을 발견했습니다. 기록을 위해이 정보는 i486 마이크로 프로세서 프로그래머 지침의 6 장, 4 페이지에 있습니다. 제 기능적인 GDT 항목은 다음과 같습니다 :

localTable equ $-gdt   ; GDT entry #5 (selector 20h) 
dw 0x1FF      ; limit to 64 descriptors 
dw 0x8000      ; base address 
db 0x0 
db 0x82       ; 10000010b (segment present set, WTM) 
db 0x1f 
db 0x0