각 프로세스마다 별도의 로컬 디스크립터 테이블을 사용할 작은 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가 실패하지 않았는지 확인하고 싶다.