Приветствую всех. У меня возникла проблема. Возникла необходимость перейти из protected mode в real mode в третьем кольце(Основная программа на Delphi7). Порылся в книгах "Ассемблер для DOS Windows и UNIX" Зубков, "Защищенный режим процессоров Intel" Фролов, но все примеры что там нашел относятся к нулевому кольцу с максимальным уровнем привилегий и в моем случае не подходят(пытался перейти в ring0 по мануалу Billy Belcebu но тоже ничего не вышло). Прошу посоветовать что можно почитать на эту тему(книги или в сети, ну а если пример так вообще хорошо).
Я просто хочу перейти в real mode, обратиться к некоторым прерываниям DOS или BIOS, после чего вернуться в PM.
SII Согласен он хочет невесть чего. Чтобы было 3-е и нулевое кольцо, проц должен работать в защищённом режиме, а потом на третьем кольце перейти в реальный,это надо чтоб проц одновременно в двух режимах работал, что невозможно. Хотя ему возможно подойдёт переход в виртуальный режим, что вполне реально.
Nafanya Угу, V8086 через Ke386CallBios(), я это юзал для настройки будильника Код (Text): NTSTATUS Ke386CallBios ( IN ULONG BiosCommand, IN OUT PCONTEXT BiosArguments ) /*++ Routine Description: This function invokes specified ROM BIOS code by executing "INT BiosCommand." Before executing the BIOS code, this function will setup VDM context, change stack pointer ...etc. If for some reason the operation fails, a status code will be returned. Otherwise, this function always returns success regardless of the result of the BIOS call. N.B. This implementation relies on the fact that the direct I/O access operations between apps are serialized by win user. Arguments: BiosCommand - Supplies which ROM BIOS function to invoke. BiosArguments - Supplies a pointer to the context which will be used to invoke ROM BIOS. Return Value: NTSTATUS code to specify the failure. --*/ Это драйвер видиопортов юзает тоже. Нужно вызывать из контекста csrss. Вот интересный кодес с реатоса: Код (Text): VOID NTAPI HalpBiosCall ( ) Definition at line 243 of file bios.c. Referenced by HalpBiosDisplayReset(). 00244 { 00245 /* Must be volatile so it doesn't get optimized away! */ 00246 volatile KTRAP_FRAME V86TrapFrame; 00247 ULONG_PTR StackOffset, CodeOffset; 00248 00249 /* Save the context, check for return */ 00250 if (_setjmp(HalpSavedContext)) 00251 { 00252 /* Returned from v86 */ 00253 return; 00254 } 00255 00256 /* Kill alignment faults */ 00257 __writecr0(__readcr0() & ~CR0_AM); 00258 00259 /* Set new stack address */ 00260 KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA); 00261 00262 /* Compute segmented IP and SP offsets */ 00263 StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart; 00264 CodeOffset = (ULONG_PTR)HalpRealModeStart & 0xFFF; 00265 00266 /* Now build the V86 trap frame */ 00267 V86TrapFrame.V86Es = 0; 00268 V86TrapFrame.V86Ds = 0; 00269 V86TrapFrame.V86Gs = 0; 00270 V86TrapFrame.V86Fs = 0; 00271 V86TrapFrame.HardwareSegSs = 0x2000; 00272 V86TrapFrame.HardwareEsp = StackOffset + CodeOffset; 00273 V86TrapFrame.EFlags = __readeflags() | EFLAGS_V86_MASK | EFLAGS_IOPL; 00274 V86TrapFrame.SegCs = 0x2000; 00275 V86TrapFrame.Eip = CodeOffset; 00276 00277 /* Exit to V86 mode */ 00278 HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame); 00279 }
Nafanya Вы что то путаете PM может быть как в ring0, так и в ring3, это просто режим работы процессора с определенным уровнем привелегий(ring0, ring3). С V86 тоже не все так просто, в ring3 привелегий не хватает(пробывал вчера установить 17 бит регистра флагов, ничего не получилось) чтоб режим V86 установить.
SOA Чтоб перейти в V8086 мод необходимо исполнить инструкцию Iretd(в флажках VM) из ISR, тоесть на нулевом кпл. зы: ясно суть задачи, на дельфе наверно проблемно дров собрать
SOA Это вы путаете. Вы говорите - "перейти из protected mode в real mode в третьем кольце" Какие кольца в real mode вы видели? Их там нет. Кольца привилегий только в защищённом режиме. О чём речь?
SOA Потому что для перехода из защищённого режима в реальный нужно выполнять запись во всякие специальные регистры, доступ к которым возможен только в нулевом кольце (попытка выполнить соответствующие инструкции не в нулевом вызовет исключение). Соответственно, прикладная программа, работающая в третьем кольце, не в состоянии заставить процессор перейти в реальный режим.
Clerk Подозреваю, что можно, если постараться. Другой вопрос, что нормальным дровам незачем переключаться в реальный режим.
Clerk Это не дров а просто программа, которая должна в одной из процедур обращаться к прерываниям. Nafanya Возможно моя формулировка несколько расплывчата. Переформулирую имеется программа на Delphi, работающая в ring3, мне нужно в этой программе сначала перейти в real mode, после чего перейти обратно в protected mode. SII Вчера все это очень хорошо наблюдал, потому и спрашиваю про ring3.
SOA Весёлая задачка То есть получается, что программа с ring 3, временно переходит в реальный режим, то есть для этого она останавливает на время Виндовоз, работающий в защищённом режиме, переключает процессор в реальный, затем выполняется, и снова переводит проц в защищённый, разрешая при этом Виндовозу продолжить свою работу после перекура Крутые программки вы пишете!
SOA Ну если виртуальный мод не устраивает, то пишите с нуля переход в реалмод. Только для чего он вам ?
SOA Зачем вам их прерывания, чего нет в NT, что есть в BIOS ? А дос это вобще откуда не понятно. В NT доса нет, есть VM.
А прерываний ДОС в реальном режиме, кстати, и не будет, если программа запущена под Виндой. ДОСа-то нету (эмуляция ДОС работает в V86, а не в реальном режиме). Но по-любому непонятно, на кой ляд понадобились эти самые прерывания?..
SOA Всётаки зачем оно вам нужно ? Хотели кодить как под досом, совместив и прерывания реалмода и винапи с дельфе ?
Clerk Хочу использовать интерфейс DPMI, а система под PM в ring3 ругается даже на такой казалось бы безобидный код Код (Text): push eax push ebx push edx mov ax,0100h mov bx,20 int 31h ;Ругается именно на int 31h mov s,dx pop edx pop ebx pop eax также потом понадобятся привилегированные команды, хотябы те же cli и sti. И тут у меня вариантов не много, либо рваться в ring0, либо в real mode, я так понимаю.