2012-01-12 3 views
3

32 비트 x86 프로세서의 일부 OS 개발의 일부로 페이지 오류 벡터에 대한 인터럽트 설명자 테이블의 작업 게이트 사용을 고려하고 있습니다. 목표는 핸들러의 스택이 맵핑되도록 보장되도록 (그리고 인터럽트 된 태스크의 스택의 일부가 맵핑되지 않은 경우를 피하도록) 태스크 전환을 강제 실행하는 것입니다.LDT가 필요합니까?

QEMU에서 커널을 실행 중이지만 페이지 폴트가 발생하면 충돌이 발생합니다 (명령 프롬프트로 돌아 가기). 나는 정확한 원인을 파악하는 데 도움이 될 수있는 힌트를 검색하고 파고 들었다. 나는 뭔가를 놓치고 있거나 뭔가 오해하고있는 것으로 생각합니다. 덧붙여 말하자면, 페이지 폴트 vecotr을 인터럽트 게이트를 사용하도록 설정하면, 나는 기대했던대로 일할 수 있습니다. 이 문제를 해결하기 위해 작업 게이트를 사용하려고 할 때입니다 (예, 작업 게이트를 계속 사용하려고합니다).

IDT 부분은 페이지 오류 벡터에 대한 작업 게이트를 올바르게 등록하도록 설정됩니다. 선택자는 GDT에서 TSS에 대한 디스크립터를 참조한다. GDT에서 TSS에 대한 설명자에 관한 한, 나는 너무 적절하게 설정되어 있는지 확신합니다.

그러나 TSS가 제대로 채워져 있고 지금까지 모든 필드를 정확하게 설정하는 방법을 결정할 수 없다면 100 % 확실하지 않습니다. esp, eip, cs, ds, es, fs, gs, ss 및 eflags와 같은 일부 항목은 비교적 간단합니다. 그러나 LDT 세그먼트 선택기와 같은 다른 것들은 덜 명확합니다. LDT 세그먼트 선택기가 0이 아니고 GDT의 LDT 설명자를 가리켜 야합니까? 위에서 설명한 시나리오에 대해 설정해야하는 필드는 무엇입니까? 이 시간을 계산하는 시간을 가지고 있습니다.

도움을 주시면 감사하겠습니다.

+0

잊어 버린 경우를 제외하고는 작업은 인터럽트 및 예외가 실행을 트리거하는 경우에도 여전히 작업이며 서브 루틴이 아닙니다. 즉, 첫 번째 인터럽트/예외 처리를 끝내고 'IRET'을 실행하면 주 루프가 있어야하므로 다음 번에이 IRET 다음에 오는 명령에서 계속 실행될 상태가됩니다. 'IRET' 이후에 "nothing"이 있으면 충돌합니다. –

+0

주목할 또 다른 사항. 작업을 '전환'하려면 작업에서 '수행'해야합니다. 작업 전환은 항상 '작업'에서 작업으로, '작업'으로 전환됩니다. 페이지 폴트 핸들러 용 TSS는 하나만 가질 수 없습니다. 당신은 적어도 두 가지 다른 것들을 가져야 만합니다. 잘못된 작업 (잘못된 TR 또는 잘못된 TSS) (예 : 잘못 초기화 된 TSS 필드) 또는 잘못된 작업으로 전환하려고하면 예외가 발생하고 충돌 할 수 있습니다. –

+0

@Alex - 감사합니다! – Sparky

답변

1

제대로 작동하는 x86 운영 체제에서는 LDT가 필요하지 않습니다 (실제로 x86-64 운영 체제에서는 금지되어 있습니다).

사용하지 않으려면 0으로 설정하십시오.

특히주의해야 할 한 가지 - TSS에 대한 osdev.org의 구조는 전면 (http://wiki.osdev.org/TSS)입니다. TSS를 잘못 취득하면 TSS 오류 예외가 발생하므로주의해야합니다.

+0

Windows에서는 금지되어 있지만 Linux에서는 금지되어 있습니다. 'modify_ldt (2)'는 여전히 AMD64 커널에서 작동합니다. – Ruslan