лан, ссылаться на даташиты не буду, но вообще-то, если мне не изменяет память, считается, что перед переходом в реал нужно перезаписать в cs нормальный селектор: с ffff лимитом, 16-разрядный итд.. а что будет, если этого не сделать, вообще не описано (unreal ведь недокументированная фича?). те же 386, кажется, просто ресетились так что вмварь сделана даже не по спецификации.. просто сделана, и это не противоречит документации Intel ну, правда, сделана неправильно )
Ну спецификация, это одно. А вот совместимость эмулятора с реальным процом это дело другое. Везде есть недокументированные фичи. И я выберу тот эмуль, который их лучше эмулирует ) А то, что это не по спецификации, както меня не волнует) ну вообще-то не селектор, а сегмент :P в реал моде селекторов нету. нужно сделать дальний джамп в сегмент, который в GDT обладает перечисленными тобой свойствами, вот, что ты, наверное, имел в виду)
чето тебя плющит) до перехода надо только сегмент такой создать, потом переход в реал моде, потом дальний джамп.
говрю же, лень в даташиты лезть.. но вообще-то на на.. не знаю даже на чем.. все было именно так. а джамп предназначался для сброса очереди предвыборки
кстати как ты и сказал, в реал моде селекторов нету.. так что после выхода из pm уже все равно, есть там дескриптор сегмента в GDT, нету.. перезагружать надо именно перед выходом, можно тоже дальним джампом и после выхода из PM джам тоже не обязательный, можно и ретом воспользоваться, или еще там чем-нибудь (не проверял)
А лучше вот вся функция переключения в RealMode: Код (Text): ; ; Note: we do not save and restore the gdt and idt values because they ; cannot change while external services are being used by the OS loader. ; This is because they MUST remain identity mapped until all mode ; switching has ceased. ; public _RealMode _RealMode proc near ; ; Switch to real-mode ; sgdt fword ptr [_GDTregister] sidt fword ptr [_IDTregister] push [saveDS] ; push this so we can get to it later mov ax,SuDataSelector mov es,ax mov fs,ax mov gs,ax mov eax,cr0 and eax, not (ENABLE_PAGING + PROT_MODE) mov cr0,eax ; ; flush the pipeline ; jmp far ptr here here: ; ; Flush TLB ; ; HACKHACK - We don't know where the page directory is, since it was ; allocated in the osloader. So we don't want to clear out cr3, ; but we DO want to flush the TLB.... ; mov eax,cr3 nop ; Fill - Ensure 13 non-page split nop ; accesses before CR3 load nop ; (P6 errata #11 stepping B0) nop mov cr3,eax ; ; switch to real mode addressing ; ; N. B. We need to do a far jump rather than a retf, because a retf will not ; reset the access rights to CS properly. ; db 0EAh ; JMP FAR PTR dw offset _TEXT:rmode ; 2000:rmode dw 02000h rmode: pop ax mov ds,ax mov ss,ax ; ; Stamp video pointers for real-mode use ; mov si,offset _ScreenStart mov word ptr [si+2],0b800h mov si,offset _vp mov word ptr [si+2],0b800h ; ; re-enable interrups ; lidt fword ptr [_IDTregisterZero] ; ; Re-enable interrupts ; sti ret _RealMode endp
ну написал же: а вот выдержка из даташита, чтобы окончательно расставить точки над первой буквой названия корпорации ))) IA-32 Intel® Architecture Software Developer’s Manual. Volume 3: System Programming Guide Order Number 245472-012. 2003 так что, что это за второй джамп, который "reset the access rights to CS properly." остается толко догадываться ))