2013-03-11 2 views
1

리얼 모드 나 빅 리얼 모드에서만 작동하는 시스템에서 my API를 호출한다고 가정합니다. 내 API는 현재 시스템 모드를 표시합니다. 그러면 현재 모드가 리얼 모드인지 빅 리얼 모드인지를 어떻게 알 수 있습니까?현재 모드가 실제 또는 큰 리얼 모드임을 어떻게 알 수 있습니까?

참고 : 큰 리얼 모드에서

  1. 는 보호 모드는 따라서는 차이가되지 않습니다 확인, CR0의 비트가 비활성화되어 있습니다.
  2. A20 주소 라인이 활성화되어 있어도 이것이 리얼 모드임을 의미하지는 않습니다.

답변

0

큰 리얼 모드에서는 리얼 모드 주소 앨리어싱이 실패합니다. 당신이 큰 리얼 모드이고 DS의 값이 0x6000이라고 가정 해 봅시다. DS의 설명자 캐시가 다시로드되었으므로 (큰 리얼 모드의 바로 정의) DS : 0의 실제 주소는 0x60000이 아닙니다. 다른 세그먼트 레지스터로 0x60000을 치면 같은 메모리 위치가 아닐 것입니다.

그래서 여기에 레시피가 있습니다. 데이터 세그먼트에 스크래치 변수를 작성하십시오. DS에 상대적인 offset에 유의하십시오. ES를 DS-1 값으로로드하고 변수 값을 변경 한 다음 ES에서 동일한 값을 얻는 지 확인하십시오 (offset + 0x10). 위조 방지를 위해 두 번 반복하십시오.

가상 86 모드를 감지하지 못합니다. 또한 ES가 캐시 된 디스크립터를 통해 높은 메모리를 가리키는 경우 ES를 다시로드하면이 값이 손실됩니다. 발신자 코드가 그대로 유지되는 ES에 의존하지 않도록하십시오.

큰 리얼 모드는 CPU 모드 그 자체가 아닙니다. "우리는 지금 진짜 큰 상태입니다."라는 레지스터 비트가 없습니다. 이것은 바닐라 리얼 모드의 i386- 특정 로직을 사용하여 높은 메모리에 액세스하는 방법 일뿐입니다. 위의 절차는 DS가 그런 식으로 취급되었는지 만 확인합니다. 구현에 따라, DOS 익스텐더는 DS 바닐라를 유지하면서 ES 디스크립터 리로딩을 통해 큰 실제를 구현할 수 있습니다. Wikipedia는 인터럽트 때문에 까다로운 명제 일지라도 때로는 CS조차 이런 식으로 앨리어스 처리됩니다. 이 실행하면

+0

BRM은 앨리어싱과 관련이 없습니다. 세그먼트 기본 주소는 '세그먼트 값 * 0x10'과 동일합니다. 그러나 세그먼트 제한은 0xFFFF보다 큰 값으로 설정되어 오프셋 0x1000000 이상을 허용합니다. 이것이 바로 BRM의 핵심입니다. –

1

는 :

mov ebx, 0x10000 
mov al, [ebx] 

을하고 #GP를 얻을, 다음 DS의 세그먼트 디스크립터는 정상적인 실제 주소 모드와 가상 8086 모드의 경우 0xFFFF가 원래 제한이있다 .

mov al, [ebx]에서 #GP을 얻지 못하면 원래 제한이 0xFFFF (일반적으로 0xFFFFFFFF이지만 반드시 그런 것은 아닙니다) 이상으로 확장되었습니다.

Btw, v86 모드를 확인하는 것은 위의 방법을 시도하기 전에 수행해야합니다. 호스트 OS가 처리기에 대한 예외를 제대로 반영하지 못하는 경우에 대비해야합니다. cr0.pe을 얻으려면 smsw을 실행하십시오. v86 모드에서는 1로 설정되고 실제 주소 모드에서는 0으로 설정됩니다. cr0mov으로 직접 읽으면 v86 모드에서 #GP이 생성되므로 smsw이 선호되는 이유입니다.

0

90 년대 초 우리는 REAL 모드에서 4Gig에 액세스 할 수있는 문서화되지 않은 방법을 사용했습니다 (지금은 BIG REAL MODE라고도 함). 이 방법은 보호 모드로 들어가서 입도 비트를 1 (1 바이트 세분성과 반대되는 4K 세분성을 의미)로 변경 한 다음 실제 모드로 돌아가서 모든 세그먼트 레지스터를 0으로 설정합니다. 그런 다음 ebx 등을 사용하여 4Gig 메모리.

그렇다면 보호 모드로 가서 세분화 비트 설정을 확인하십시오. 미안하지만 오래된 모든 매뉴얼이 다락방에 있습니다. 그 정보가 필요하다면 나는 그들을 파헤쳐 낼 수 있습니다.

관련 문제