Переход из PM под ring3 в Real mode

Тема в разделе "WASM.BEGINNERS", создана пользователем SOA, 24 окт 2010.

  1. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Приветствую всех.
    У меня возникла проблема.
    Возникла необходимость перейти из protected mode в real mode в третьем кольце(Основная программа на Delphi7). Порылся в книгах "Ассемблер для DOS Windows и UNIX" Зубков, "Защищенный режим процессоров Intel" Фролов, но все примеры что там нашел относятся к нулевому кольцу с максимальным уровнем привилегий и в моем случае не подходят(пытался перейти в ring0 по мануалу Billy Belcebu но тоже ничего не вышло).
    Прошу посоветовать что можно почитать на эту тему(книги или в сети, ну а если пример так вообще хорошо).
     
  2. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Это сделать невозможно.
     
  3. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Как, почему 80?
     
  4. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Я просто хочу перейти в real mode, обратиться к некоторым прерываниям DOS или BIOS, после чего вернуться в PM.
     
  5. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    SII
    Согласен он хочет невесть чего. Чтобы было 3-е и нулевое кольцо, проц должен работать в защищённом режиме, а потом на третьем кольце перейти в реальный,это надо чтоб проц одновременно в двух режимах работал, что невозможно.

    Хотя ему возможно подойдёт переход в виртуальный режим, что вполне реально.
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Nafanya
    Угу, V8086 через Ke386CallBios(), я это юзал для настройки будильника ;)
    Код (Text):
    1. NTSTATUS
    2. Ke386CallBios (
    3.     IN ULONG BiosCommand,
    4.     IN OUT PCONTEXT BiosArguments
    5.     )
    6.  
    7. /*++
    8.  
    9. Routine Description:
    10.  
    11.     This function invokes specified ROM BIOS code by executing
    12.     "INT BiosCommand."  Before executing the BIOS code, this function
    13.     will setup VDM context, change stack pointer ...etc.  If for some reason
    14.     the operation fails, a status code will be returned.  Otherwise, this
    15.     function always returns success regardless of the result of the BIOS
    16.     call.
    17.  
    18.     N.B. This implementation relies on the fact that the direct
    19.          I/O access operations between apps are serialized by win user.
    20.  
    21. Arguments:
    22.  
    23.     BiosCommand - Supplies which ROM BIOS function to invoke.
    24.  
    25.     BiosArguments - Supplies a pointer to the context which will be used
    26.                     to invoke ROM BIOS.
    27.  
    28. Return Value:
    29.  
    30.     NTSTATUS code to specify the failure.
    31.  
    32. --*/
    Это драйвер видиопортов юзает тоже. Нужно вызывать из контекста csrss.

    Вот интересный кодес с реатоса:
    Код (Text):
    1. VOID NTAPI HalpBiosCall (        )  
    2. Definition at line 243 of file bios.c.
    3.  
    4. Referenced by HalpBiosDisplayReset().
    5.  
    6. 00244 {
    7. 00245     /* Must be volatile so it doesn't get optimized away! */
    8. 00246     volatile KTRAP_FRAME V86TrapFrame;
    9. 00247     ULONG_PTR StackOffset, CodeOffset;
    10. 00248    
    11. 00249     /* Save the context, check for return */
    12. 00250     if (_setjmp(HalpSavedContext))
    13. 00251     {
    14. 00252         /* Returned from v86 */
    15. 00253         return;
    16. 00254     }
    17. 00255    
    18. 00256     /* Kill alignment faults */
    19. 00257     __writecr0(__readcr0() & ~CR0_AM);
    20. 00258    
    21. 00259     /* Set new stack address */
    22. 00260     KeGetPcr()->TSS->Esp0 = (ULONG)&V86TrapFrame - 0x20 - sizeof(FX_SAVE_AREA);
    23. 00261
    24. 00262     /* Compute segmented IP and SP offsets */
    25. 00263     StackOffset = (ULONG_PTR)&HalpRealModeEnd - 4 - (ULONG_PTR)HalpRealModeStart;
    26. 00264     CodeOffset = (ULONG_PTR)HalpRealModeStart & 0xFFF;
    27. 00265    
    28. 00266     /* Now build the V86 trap frame */
    29. 00267     V86TrapFrame.V86Es = 0;
    30. 00268     V86TrapFrame.V86Ds = 0;
    31. 00269     V86TrapFrame.V86Gs = 0;
    32. 00270     V86TrapFrame.V86Fs = 0;
    33. 00271     V86TrapFrame.HardwareSegSs = 0x2000;
    34. 00272     V86TrapFrame.HardwareEsp = StackOffset + CodeOffset;
    35. 00273     V86TrapFrame.EFlags = __readeflags() | EFLAGS_V86_MASK | EFLAGS_IOPL;
    36. 00274     V86TrapFrame.SegCs = 0x2000;
    37. 00275     V86TrapFrame.Eip = CodeOffset;
    38. 00276    
    39. 00277     /* Exit to V86 mode */
    40. 00278     HalpExitToV86((PKTRAP_FRAME)&V86TrapFrame);
    41. 00279 }
     
  7. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Nafanya
    Вы что то путаете PM может быть как в ring0, так и в ring3, это просто режим работы процессора с определенным уровнем привелегий(ring0, ring3). С V86 тоже не все так просто, в ring3 привелегий не хватает(пробывал вчера установить 17 бит регистра флагов, ничего не получилось) чтоб режим V86 установить.
     
  8. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SOA
    Чтоб перейти в V8086 мод необходимо исполнить инструкцию Iretd(в флажках VM) из ISR, тоесть на нулевом кпл.

    зы: ясно суть задачи, на дельфе наверно проблемно дров собрать :lol:
     
  9. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    SOA
    Это вы путаете. Вы говорите - "перейти из protected mode в real mode в третьем кольце"
    Какие кольца в real mode вы видели? Их там нет. Кольца привилегий только в защищённом режиме. О чём речь?
     
  10. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    SOA
    Потому что для перехода из защищённого режима в реальный нужно выполнять запись во всякие специальные регистры, доступ к которым возможен только в нулевом кольце (попытка выполнить соответствующие инструкции не в нулевом вызовет исключение). Соответственно, прикладная программа, работающая в третьем кольце, не в состоянии заставить процессор перейти в реальный режим.
     
  11. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Clerk
    Подозреваю, что можно, если постараться. Другой вопрос, что нормальным дровам незачем переключаться в реальный режим.
     
  12. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Clerk
    Это не дров а просто программа, которая должна в одной из процедур обращаться к прерываниям.

    Nafanya
    Возможно моя формулировка несколько расплывчата.
    Переформулирую имеется программа на Delphi, работающая в ring3, мне нужно в этой программе сначала перейти в real mode, после чего перейти обратно в protected mode.

    SII
    Вчера все это очень хорошо наблюдал, потому и спрашиваю про ring3.
     
  13. Nafanya

    Nafanya Member

    Публикаций:
    0
    Регистрация:
    26 июл 2006
    Сообщения:
    581
    SOA
    Весёлая задачка:)
    То есть получается, что программа с ring 3, временно переходит в реальный режим, то есть для этого она останавливает на время Виндовоз, работающий в защищённом режиме, переключает процессор в реальный, затем выполняется, и снова переводит проц в защищённый, разрешая при этом Виндовозу продолжить свою работу после перекура:)
    Крутые программки вы пишете!
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SOA
    Ну если виртуальный мод не устраивает, то пишите с нуля переход в реалмод. Только для чего он вам ?
     
  15. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Clerk
    Нужно обращаться к прерываниям DOS и BIOS, а в PM это сделать не получается.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SOA
    Зачем вам их прерывания, чего нет в NT, что есть в BIOS ?

    А дос это вобще откуда не понятно. В NT доса нет, есть VM.
     
  17. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    А прерываний ДОС в реальном режиме, кстати, и не будет, если программа запущена под Виндой. ДОСа-то нету (эмуляция ДОС работает в V86, а не в реальном режиме).

    Но по-любому непонятно, на кой ляд понадобились эти самые прерывания?..
     
  18. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    :dntknw:
    Думаю вопрос можно закрыть.
    P.S. всем кто откликнулся спасибо.
     
  19. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    SOA
    Всётаки зачем оно вам нужно ?

    Хотели кодить как под досом, совместив и прерывания реалмода и винапи с дельфе :) ?
     
  20. SOA

    SOA New Member

    Публикаций:
    0
    Регистрация:
    31 май 2010
    Сообщения:
    67
    Clerk
    Хочу использовать интерфейс DPMI, а система под PM в ring3 ругается даже на такой казалось бы безобидный код

    Код (Text):
    1.   push eax
    2.   push ebx
    3.   push edx
    4.  
    5.   mov ax,0100h
    6.   mov bx,20
    7.   int 31h      ;Ругается именно на int 31h
    8.   mov s,dx
    9.  
    10.   pop edx
    11.   pop ebx
    12.   pop eax
    также потом понадобятся привилегированные команды, хотябы те же cli и sti.
    И тут у меня вариантов не много, либо рваться в ring0, либо в real mode, я так понимаю.