Проблема перехода в защищённый режим

Тема в разделе "WASM.ASSEMBLER", создана пользователем C0DiCK, 18 окт 2005.

  1. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Возможно кто-нибудь найдёт ошибку в следующем

    коде, который должен осуществлять перевод процессорв в защищённый



    режим.

    Объявления:

    GDTREG STRUC ;Global Description Table Register

    Limit DW ? ;лимит таблицы GDT

    OFFS DD ? ;биты 31-00 смещения таблицы



    GDT

    GDTREG ENDS

    GDI STRUC ;Global Description Item

    Limit15_00 DW ? ;биты 15-00 лимита



    сегмента

    Base15_00 DW ? ;биты 15-00 базы



    сегмента

    Base23_16 DB ? ;биты 23-16 базы



    сегмента

    ;флаги [7 - P - 7] [6 - DPL - 5] [4 - S - 4] [3 -



    TYPE - 0]

    ; P - 0 отсутствует, 1 присутствует; S - 0 системный,



    1 код или данные

    Flags1 DB ?

    ;флаги [7 - G - 7] [6 - D/B - 6] [5 - O - 5] [4 - AVL



    - 4] [3 - Limit19_16 - 0]

    ; G - 0 в байтах, 1 в 4 Кб

    Flags2 DB ?

    Base31_24 DB ? ;биты 31-24 базы



    сегмента

    GDI ENDS

    Глобальная таблица дескрипторов:

    Null GDI <0h, 0h, 0h, 0h, 0h, 0h>

    hCode GDI <0FFFFh, 0h, 0h, 10011000b, 0h, 0h>

    hStack GDI <511, 0h, 0h, 92h, 0h, 0h>

    Регистр, описывающий глобальную таблицу дескрипторов:

    GDTR_GDTREG GDTREG <23, 0h>

    А вот и проблемный код:

    MOV EAX, CS

    SHL EAX, 04h

    MOV EBX, OFFSET hCode

    MOV [EBX].Base15_00, AX

    SHR EAX, 16

    MOV [EBX].Base23_16, AL

    MOV [EBX].Base31_24, AH



    MOV EAX, CS

    SHL EAX, 04h

    ADD AX, OFFSET Null

    MOV EBX, OFFSET GDTR_GDTREG

    MOV DWORD PTR [EBX].OFFS, EAX

    LGDT FWORD PTR GDTR_GDTREG

    CLI



    ; запретить немаскируемое прерывание

    in al,70h ; индексный порт CMOS

    or al,80h ; установка бита 7 в нем



    запрещает NMI

    out 70h,аl





    ;Включение адресной линии A20:

    in al, 92h

    or al, 2

    out 92h, al



    ;Обнуление регистра флагов:

    push byte 2

    popf



    MOV EAX, CR0

    OR AL, 1

    MOV CR0, EAX

    Суть проблемы:

    После исполнения последней команды компьютер перезагружается.



    Где ошибка?
     
  2. nobody

    nobody New Member

    Публикаций:
    0
    Регистрация:
    8 сен 2004
    Сообщения:
    32
    Адрес:
    Afghanistan
    В GDTR.BASE должен быть адрес Null а не hCode



    А после

    MOV CR0,EAX

    у тебя идет

    jmp far 8:offset ?
     
  3. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Ну, так я нахожу физический адрес сегмента кода, умнажая значение CS на 16, и добавляю смещение Null.

    А после MOV CR0, EAX у меня всё правильно.
     
  4. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Вот новые данные. Тут добавлены обработчики трёх основных прерываний и т. д. Смотрите файл.

    И что такое Bosh?
     
  5. halyavin

    halyavin New Member

    Публикаций:
    0
    Регистрация:
    13 май 2005
    Сообщения:
    252
    Адрес:
    Russia
    Bochs - это эмулятор, в котором можно отлаживать операционную систему.
     
  6. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    А инициализировать лимит таблицы GDT кто будет?
     
  7. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Я, но позже
     
  8. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Понимаю, что уже надоел своим защищённым режимом, но у меня проблемы со стэком. Пробывал разные варианты. Десять раз проверял дескриптор. Но компьютер перезагружается, если я пытаюсь использовать стэк. Вот очередная версия файла. Заранее спасибо.

    [​IMG] _807047932__TLOADER.ASM
     
  9. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    C0DiCK

    Перед меткой continue отсутствует use32, а в дескрипторе написано что код 32х-битный.

    Еще у тебя очень странно инициализируется ESP и дескриптор стека.
     
  10. The Svin

    The Svin New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2003
    Сообщения:
    665
    Адрес:
    Russia
    Я ничего не понял в принципе определения базы сегмента стека.( esp = (cs+1)*4 ? так что ли? база оказывается выше на параграф? а если CS=00FF то inc al = 0 и esp будет 0? и при первом же push переполнение?)

    И главное что я не понял - почему при таком определении ты уверен что смещение в esp после первого же push не будет ниже предела?

    У тебя предел 511, ниже база+предел ты опускаться не можешь, а у тебя вобще в esp база и ты опустишься ниже её при первом же push



    А если оно не будет выше - сразу же исключение и получим. Esp должно сразу устанавливаться на база + предел + размер желаемый IMHO. Причём базой не оффсет вычисляемый через кол. пар. в CS а тот же в параграфах на байты CS*4 + предел CS или лучше DS*4 + предел DS, вобщем тот который у тебя по схеме выше.

    Так вроде тоже можно будет esp = HighestSegReg*4+HighestSegSize+SSsegSize так думается.

    Предел можно HighestSegReg*4+HighestSegSize

    Тогда базу можно 0. Я так думаю. Где понимающие специалисты по PM недавно много тут было?
     
  11. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    The Svin

    У него в дескрипторе стека написано
    Код (Text):
    1. hStack  GDI <511, 0FFFFh, 0h, 10010<font color="red]1</font><!--color-->10b, 01000000b, 0h>
    то есть сегмент расширяется вниз, следовательно esp должен быть больше границы. Хоть инициализация ESP выглядит дико, но условие это выполнятеся. Но из-за отсутствия директивы use32, после перехода, пара команд MOV AX,10000b/MOV SS,AX интерпретируется процессором как MOV EAX,????????. соответственно в SS ничего не загружается, и он остаётся с границей в 64К и без "расширения вниз", а вот ESP уже указывает за пределы сегмента.
     
  12. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Так что, надо так делать:

    MOV AX, 10000b

    PUSH AX

    POP SS
     
  13. Same

    Same New Member

    Публикаций:
    0
    Регистрация:
    23 окт 2003
    Сообщения:
    114
    2The Svin

    Где понимающие специалисты по PM недавно много тут было?

    Замучились одно и тоже обьяснять:)
     
  14. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    C0DiCK

    Нужно правильно директивы расставлять, в частности поставить перед continue USE32, или в дескрипторе кодового сегмента написать что код 16 битный. А то у тебя генерируемый код не соответствует его описанию в дескрипторе. А так же читать про стек, пока не наступит просветление 8)
     
  15. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    Да, всё. Спасибо. Я учёл все недостатки. Всё работает.

    Теперь другое дело. Я тут решил побаловаться со страничной адресацей, а не получается. Посмотрите пожалуйста.

    [​IMG] _1464021672__TLOADER.ASM
     
  16. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    Код (Text):
    1. ;заполнение каталога таблиц размещения страниц
    2.     MOV EDI, 00000000h  ;по адресу 1MB(100000h)


    Почему здесь в EDI загружается 0?



    В StrOut32 значение загружаемое в EDI не соответствует значению загружаемому в ES, нужно в EDI грузить 0.
     
  17. C0DiCK

    C0DiCK New Member

    Публикаций:
    0
    Регистрация:
    18 окт 2005
    Сообщения:
    38
    В EDI загружается ноль потому что это смещение относительно базы сегмента в ES.
     
  18. trash

    trash New Member

    Публикаций:
    0
    Регистрация:
    9 апр 2006
    Сообщения:
    143
    Адрес:
    х.з.
    Переход RM->PM16->PM32->PM16->UNREAL



    TASM :)