2016-08-01 6 views
0

보호 모드 전환에 대해이 사실을 연구하고있었습니다. 나는 보호 모드에 대한 실제가 ldt 및 idt를로드하지 않고 gdt를로드함으로써 발생할 수 있는지 여부를 의심했습니다. 한편으로는 리얼 모드 프로그램을 v8086 모드로 전환하지 않고 보호 모드로 실행할 수없는 이유가 두 번째 의심 스럽습니다.리얼 모드 애플리케이션을 보호 모드로 실행할 수없는 이유는 무엇입니까?

감사합니다.

답변

2

LDT는 선택 사항입니다. IDT는 리얼 모드 IVT와 동일한 보호 모드이며 동일한 목적을 수행합니다. ISR 및 예외 처리기에 진입 점을 설명합니다. 하드웨어 및 소프트웨어 인터럽트 및 예외를 처리하려면 IDT가 필요합니다. 그것들없이 살 수 있다면, IDT를 설정할 필요가 없습니다.

보호 모드로 전환하려면 GDT를 설정하고 LGDT를 수행하는 것보다 더 많은 것이 필요합니다. CR0 비트 0을 1로 변경하고, 점프를 수행하고, 적절한 GDT 항목을 가리키는 셀렉터로 세그먼트 레지스터 (다양한 컨텍스트 스위치 중 초기화되지 않은 세그먼트 레지스터 문제를 피하기 위해 모두 바람직하게로드)를로드해야합니다.

세그먼트 레지스터의 리얼 모드 값이 보호 모드에서 작동 할 수 없으며 세그먼트 : 오프셋 주소 (세그먼트 808 (하위) 모드)를 제외하기 때문에 실제 모드 코드는 일반적으로 보호 모드 (가상 8086 보호 모드에서 다른 방식으로 실제 주소로 변환됩니다 (GDT 및 페이지 변환에서 읽음). IOW, 세그먼트 레지스터의 값에 1을 더하면 더 이상 결과 물리적 주소에 16을 더하지 않습니다. 또한 동시에 읽기, 쓰기 및 실행이 가능한 세그먼트를 가질 수 없습니다.

이론적으로 선택기 N이 N * 16의 기본 주소를 가진 64KB 세그먼트에 대한 설명자를 선택하는 것과 같은 방식으로 GDT 및/또는 LDT 설명자를 설정할 수 있습니다. 실제로 그것은 kludge입니다. 그러나 Borland는 Borland Pascal 7에서이 제도를 구현 했으므로 보호 모드 프로그램을 작성하여 실제 모드로 작성하는 것과 비슷한 방식으로 작성할 수 있습니다.

+0

세그먼트에 대해 자세히 설명해 주시겠습니까? 보호 모드에서 오프셋 번역을 하시겠습니까? –

+3

@PantherCoder 필수 읽기 : 인텔 ® 64 및 IA-32 아키텍처 소프트웨어 개발자 설명서, vol. 3 "시스템 프로그래밍 안내서", 2 ~ 5 장 및 장. –

+0

예, 보통 16 비트 보호 모드에서 프로세서를 사용합니다. 일부 초기 OS 및 환경에서는 메모리 액세스 오류가 발생하므로 오류 처리기는 명령을 올바르게 완료 한 다음 오류를 유발 한 명령에서 다시 시작하도록 일련의 설명자 항목을 생성합니다. 종종 LOADALL 명령어를 사용하여 숨겨진 설명자 항목을 직접로드 할 수 있습니다. 물론 이것은 함정이 많이있었습니다. OS와 프로그램을 동시에 실행하기를 원하면 OS와 보호 모드 프로그램이 함께 작동하기가 어려워서 디스크립터 중 일부가 겹칠 수 있습니다. –