проц. никак не хочет защищаться

Тема в разделе "WASM.ASSEMBLER", создана пользователем Abnormal, 5 май 2005.

  1. Abnormal

    Abnormal New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    9
    Адрес:
    Russia
    Такая проблема: при переходе в защищенный режим из под ДОСа - процессор вырубается (просто перезагрузка).

    Делаю все как тов. Зубков прописал:



    1.открываю адресную линию А20. (непосредственно к PM это отношения не имеет, пока мы не собираемся писать в адрес больше 0fffffh)

    in al,92h

    or al,2

    out 92h,al



    2.Вычисляем линейный адрес GDT

    (mov ax,SEG (любой загруженный сегмент)

    shl eax,4

    add eax,offset GDT

    или же

    add ax,offset GDT (в зависимости от разрядности сегмента, где лежит GDT - TASM иначе плюется:)).



    3.Формирую переменную с размером\адресом GDT.

    4.Загружаю GDT (состоящую только из нулевого дескриптора - для начала).



    5.Запрещаю прерывания.(cli)



    6.Запрещаю немаскируемые прерывания (чего-такое - не до конца уяснил еще)

    in al,70h

    or al,80h

    out 70h,al



    7.Ну, собственно, переходим в PM:

    mov eax,cr0

    or al,1

    mov cr0,eax ;Здесь происходит обрушение.





    jmp short next ;сбрасываем очередь предвыборки...

    next:

    ;OTHER CODE...



    Собственно вопрос: семптомом чего является такая глухая перезагрузка. Может кто сталкивался...



    Да, и где можно скачать нормальный САйс под ДОС.



    "Боже!!! Зачем тебе вручную PM, да еще сквозь ДОС?!" - спросите вы.

    Отвечаю - "просто из любопытства."

    "Вопрос ведет нас..."
     
  2. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    Зачем айс под дос? Используй виртуалку, Bochs например.

    что обрушение происходит именно mov cr0,eax , маловероятно, обычно падает на jmp.

    Нужен не просто jmp short а межсегментный jmp, причём (32битный). формируется примерно так:

    db 66h ; префикс 32 битного кода

    db 0EAh ; опкод jmp

    dd 00000000h ; куда прыгать?

    dw 00001000b ; селектор



    "Вычисляем линейный адрес GDT"

    И куда ты его дальше деваешь?

    Так простовзял и посчитал :)



    Так что читай ещё раз доку...
     
  3. Abnormal

    Abnormal New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    9
    Адрес:
    Russia
    Для инструкции загрузки GDT, необходимо сформировать переменную из 6 байт. Младшие 2 байта = размер GDT минус 1, а старшие 4 = линейный адрес GDT, которая будет загружаться и маска которой расположена в одном из сегментов нашей процедуры.

    Соответственно, получая линейный адрес, мы его записываем в старшие 4 байта переменной, которая будет загружена в регистр GDTR нструкцией LGDT.



    Физический адрес (просто спутал с линейным) считается так: сегментный адрес умножается на 16 (shl 4) (т.к. адресная шина 20-битная) и к нему прибавляется смещение внутри сегмента.



    "Виртуалка" - виртуальная машина?
     
  4. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    Abnormal

    все примеры Зубкова в0 2м издании по крайней мере работоспособны, сам проверял в свое время. А ты лечше глянь, нет ли там у тебя в конфиге расширителей и мемеорумангеров прописаных
     
  5. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    Код (Text):
    1.  
    2. db 66h ; префикс 32 битного кода
    3. db 0EAh ; опкод jmp
    4. dd 00000000h ; куда прыгать?
    5. dw 00001000b ; селектор
    6.  


    Лучше Так (Должен быть Стек)
    Код (Text):
    1. MOV   AX,SELECTOR
    2. PUSH  AX
    3. MOV   EAX,OFFSET_PMCODE_START
    4. PUSH  EAX
    5. RETF




    2 Abnormal

    7.Ну, собственно, переходим в PM:

    mov eax,cr0

    or al,1

    mov cr0,eax ;Здесь происходит обрушение.


    1.Неправильно определенный дескрипторы

    2.Неправильно инизиализированая GDT
     
  6. Abnormal

    Abnormal New Member

    Публикаций:
    0
    Регистрация:
    5 май 2005
    Сообщения:
    9
    Адрес:
    Russia
    Всем спасиб0.
     
  7. _edge

    _edge Well-Known Member

    Публикаций:
    1
    Регистрация:
    29 окт 2004
    Сообщения:
    631
    Адрес:
    Russia
    извините, а himem // emm386 случаем в памяти не болтаются?

    привелигерованные операции подразумевают их отсутствие.