lgdt: CPU error: incorrect opcode

Тема в разделе "WASM.BEGINNERS", создана пользователем FeelUs, 13 мар 2020.

Метки:
  1. FeelUs

    FeelUs New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2020
    Сообщения:
    2
    Читаю Аблязова, (Глава 2.1.4 Введение в защищенный режим, страница 64)
    Код (ASM):
    1.  
    2. ORG 100h ; com-программа
    3. start:
    4. ; очистка экрана:
    5.         mov     ax, 3
    6.         int     10h
    7. ; msg0
    8.         mov dx,msg0
    9.         mov ah,9
    10.         int 21h
    11. ; открываем линию A20 (дл¤ 32-битной адресации): ; 32-битна¤ адресаци¤ видеопам¤ти
    12.         in      al, 92h
    13.         or      al, 2
    14.         out     92h, al
    15.        
    16. ; вычисл¤ем линейный адрес точки входа в защищенный режим
    17.         xor     eax,eax
    18.         mov     ax,cs
    19.         shl     eax, 4
    20.         add     eax, PROTECTED_MODE_ENTRY_POINT
    21.         mov     [ENTRY_OFF],eax
    22. ; теперь надо вычислить линейный адрес GDT
    23.         xor     eax,eax
    24.         mov     ax,cs
    25.         shl     eax, 4
    26.         add     ax, GDT
    27. ; линейный адрес GDT кладем в заранее подготовленную переменную
    28.         mov     dword [GDTR+2],eax
    29. ; msg1
    30.         mov dx,msg1
    31.         mov ah,9
    32.         int 21h
    33. ; загрузка регистра GDTR:
    34.         lgdt fword [GDTR]
    35. ; msg2
    36.         mov dx,msg2
    37.         mov ah,9
    38.         int 21h
    39. ; запрет всех прерываний:
    40.         cli
    41.         in al,70h
    42.         or al,80h
    43.         out 70h,al
    44. ; переключение в защищенный режим
    45.         mov eax,cr0
    46.         or al, 1
    47.         mov cr0,eax
    48.        
    49. ; загрузить новый селектор в регистр CS
    50.         db 66h ; префикс изменени¤ разр¤дности операнда
    51.         db 0EAh ; опкод команды JMP FAR
    52.         ENTRY_OFF dd PROTECTED_MODE_ENTRY_POINT; 32-битное смещение
    53.         dw 00001000b ; селектор первого дескриптора
    54. ; ГЛОБАЛЬНАЯ ТАБЛИЦА ДЕСКРИПТОРОВ
    55. GDT:
    56.         NULL_descr  db 8 dup(0)
    57.         CODE_descr  db 0FFh,0FFh,00h,00h, 00h,10011010b,11001111b,00h
    58.         DATA_descr  db 0FFh,0FFh,00h,00h, 00h,10010010b,11001111b,00h
    59.         VIDEO_descr db 0FFh,0FFh,00h,80h, 0Bh,10010010b,01000000b,00h
    60. GDT_size equ $-GDT
    61. label GDTR fword
    62.         dw GDT_size-1; 16-битный лимит GDT
    63.         dd ? ; здесь будет 32-битный линейный адрес GDT
    64. use32 ; далее следует 32-битный код
    65. PROTECTED_MODE_ENTRY_POINT:
    66. ; загрузим сегментные регистры требуемыми селекторами
    67.         mov     bx,ds ; номер сегмента кода режима реальных адресов
    68.        
    69.         mov     ax,00010000b ; DATA_descr
    70.         mov     ds, ax
    71.        
    72.         mov     ax,00011000b ; VIDEO_descr
    73.         mov     es, ax
    74.        
    75. ; вывод на экран:
    76.         xor     esi,esi
    77.         mov     si,bx
    78.         shl     esi,4
    79.         add     esi, message
    80.         xor     edi,edi
    81.         mov     ecx,18
    82.         rep movsb ; ds:[esi]->es:[edi]
    83.         jmp     $
    84. message:
    85.          db '1',35h,'2',35h,'3',35h,'4',35h,'5',35h,'6',35h,'7',35h,'8',35h,'9',35h
    86. msg0: db 'msg0',0Dh,0Ah,'$'
    87. msg1: db 'msg1',0Dh,0Ah,'$'
    88. msg2: db 'msg2',0Dh,0Ah,'$'
    89.  

    при выполнении команды lgdt (строка 34) происходит ошибка "CPU error: incorrect opcode. Killing Process"
    т.е. msg0 и msg1 выводятся, а msg2 - уже нет, вместо него сообщение об ошибке

    Как я это делаю:
    в VirtualBox создал новую ОС как "windows XP (32 bit)", но установил MS-DOS 7.10 (http://old-dos.ru/files/file_764.html)

    листинг компилирую в fasm в windows (на всякий случай посмотрел на com-файл из под IDA - 16-битный код скомпилировался правильно)
    com-файл помещаю в iso-образ, который открываю в DOS как диск D
    и запускаю, прямо с диска D

    Вопрос 1:
    Почему происходит такая ошибка и как это преодолеть?

    Я предполагаю, что виртуальная машина проверяет каждую инструкцию, и если ей что-то не нравится, она вызывает прерывание,
    а DOS это прерывание обрабатывает, убивает процесс и выводит сообщение.

    Вопрос 2:
    Прав ли я, и если да, то как тогда на точно такой же виртуальной машине выполняется windows XP?
     
  2. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    988
    Посмотрите как делать загрузчики ос. Пригодится. Когда ось загружена вы уже в другом режиме. Вам надо до загрузке оси успеть этот код выполнить.
     
  3. FeelUs

    FeelUs New Member

    Публикаций:
    0
    Регистрация:
    13 мар 2020
    Сообщения:
    2
    В каком? DOS ведь должна оставаться в реальном режиме?!
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    MS-DOS 7.0 и выше это ОСЬ "Как часть Windows 95"
    Возьмите более старую версию мсдоса
     
    FeelUs и Indy_ нравится это.
  5. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6.074
    TermoSINteZ нравится это.
  6. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    IA, lgdt:

    V86/PM:
     
  7. НетРегистрации

    НетРегистрации Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    Еще один вопрос к применению учебника. "39 ; запрет всех прерываний:" А SMI?
     
  8. q2e74

    q2e74 Active Member

    Публикаций:
    0
    Регистрация:
    18 окт 2018
    Сообщения:
    988
    https://www.amd.com/system/files/TechDocs/24594.pdf
    ctrl+f -> smi = system management interrupt

    а если работа с флогом if из EFLAGS то это пара cli и sti - clear и set . это 1.2.2 и 1.2.8 в книжке, которую вы читаете. Какое место вы читаете, укажите конкретнее?
     
  9. НетРегистрации

    НетРегистрации Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    До Windows XP включительно под администратором нахожусь в UM, ввод-вывод доступен весь, чипсет VIA KT400 предпочтительнее чем Intel 865, соответственно смотрю южный мост VT8235.pdf. На стр. 86 нашел "Disable all SMI generation"? ClI и NMI да выше написано.
    Т.Е. "запрет всех прерываний:" для каждого чипсета конкретен. Если это можно сделать и через MSR, то мне пришлось бы периодически менять моды UM-KM, т.к. надо запрещать на некоторый временной интервал.
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    НетРегистрации,

    Какие есчо мосты, что то я не пойму. Это вопрос из зала рядом ?

    Вроде бы как тут вопрос про косяк с V86, месье не исчет лёгких путей(зачем отладчик, слишком просто..). Но а у тебя вообще какая то каша в голове, какие прерывания и мср :sarcastic:
     
  11. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
  12. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Попутный вопрос из той же серии:

    Как можно отлаживать свой код загрузчика?

    Компилирую свой код в FASM'е с отладочной инф-ей. Запускаю образ дискеты с загрузчиком при помощи IDA и QEMU. Подгружаю .fas файл при помощи скрипта в ИДУ, но отладочная инф-ция не отображается. А хотелось бы видеть в каком ты находишся месте относительно исходника.
     
  13. НетРегистрации

    НетРегистрации Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    Фраза из учебника "запрет всех прерываний:" и дальнейший код актуальна только до 386 процессоров включительно и их чипсетов, т.к. у них нет прерываний SMI, эти электрические выводы появились начиная с 486 процессоров. И начиная с них для блокировки для них "всех прерываний:" надо еще заблокировать и SMI. Поправьте если не так.
    P.S. NMI я в начале 90-х использовал для некоторых трассировок вввода-вывода на 386 и 486.
     
    _edge нравится это.
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    4.775
    Наверно нужно тему создать по досу или может уже есть, столь популярна. Вероятно из за лаб работ.

    Как бы там небыло, реалмод примитивен, следует изучать общую архитектуру https://software.intel.com/en-us/do...bined-volumes-1-2a-2b-2c-2d-3a-3b-3c-3d-and-4

    Может быть стрёмным столь тяжёлый док, но там всё структурировано и перекрёстные ссылки, так что при желании можно быстро привыкнуть к этим сложностям.

    Тут же получается что проблемы надуманны из за не понимания простого материала, мешается всё в кучу - прерывания и железо. Какие есчо чипсеты, программинг аппаратной шины выходит за пределы IA. Это сложная тема и не имеет отношения к мсдос и лаб работам.

    В целом же нет никаких 486.. это абстракция. У вас что там в лаборатории стенд с распайкой этого процика, сомневаюсь иначе бы вопросы были иного рода.
     
    НетРегистрации нравится это.
  15. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Не нужно блокировать все прерывания. Нужно заблокировать только стандартные + NMI. Более того, вы не заблокируете, никакими программными методами SMI

    добавлю . некоторые чипсеты позволяют выключить генерацию SMI . Но я не рекомендую вам этого делать

    И вообще это вам нужно читать документацию по APIC и чипсетам материнки. А не по процессорам.
     
    Последнее редактирование: 14 мар 2020
    НетРегистрации нравится это.
  17. НетРегистрации

    НетРегистрации Member

    Публикаций:
    0
    Регистрация:
    1 фев 2020
    Сообщения:
    72
    Indy_ "лабораторка" следующая - как временно заблокировать SMI прерывания на чипсетах Via KT400 и Intel865. Уж больно много раз встречается там в документации слово SMI. Один бит ссылается на другой и т.д. и т.п. действительно возникает каша в голове.
    Термосинтез - Вы точно в этом уверены? Если да, то на основании чего?
     
  18. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    на основании опыта, и чтения документаций на разные чипсеты.
    Если вам в лабе задали отключить SMI (временно) на заданных чипсетах - вам надо искать информацию по этим чипсетам и APIC

    Ну а если вас интересует только пример кода работы с портами чипсета который это поддерживает. Да вот хотябы тут смотрите
    https://chromium.googlesource.com/c...master/drivers/watchdog/iTCO_vendor_support.c
     
    НетРегистрации нравится это.
  19. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.546
    Адрес:
    Russia
    Последнее редактирование: 14 мар 2020
  20. GRAFik

    GRAFik Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2020
    Сообщения:
    352
    Так я так и делаю и причем очень успешно, но одна беда Ида не видит отладочной инф-ии от FASM-исходника. Чуть выше в моем первом посте я все описал.