Помогите с защищенным режимом!

Тема в разделе "WASM.ASSEMBLER", создана пользователем noxyucT, 30 окт 2004.

  1. noxyucT

    noxyucT New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2004
    Сообщения:
    4
    Помогите плз разобраться с защищенным режимом... Читаю на сайте статьи Broken Sword`а на эту тему и начал писать код. Но что-то не получается :dntknw:



    Вот сама программа (на fasm):
    Код (Text):
    1.  
    2. format binary
    3. use16
    4. org 7c00h
    5.  
    6. ;Очистка экрана
    7.         mov ax, 3
    8.         int 10h
    9.  
    10.         cli
    11.  
    12. ;Открываем линию A20 для 32-х битной адресации
    13.         in  al, 92h
    14.         or  al, 2
    15.         out 92h, al
    16.  
    17. ;Загружаем GDT
    18.         lgdt    [GDTR]
    19.  
    20. ;Переключаемся в защищенный режим
    21.         mov eax, cr0
    22.         or  al, 1
    23.         mov cr0, eax
    24.  
    25.         jmp far 8:entry_point
    26.  
    27. GDT:
    28. NULL_descr: times 8 db 0
    29. CODE_descr  db 0ffh, 0ffh, 00h, 00h, 00h, 10011010b, 11001111b, 00h
    30. DATA_descr  db 0ffh, 0ffh, 00h, 00h, 00h, 10010010b, 11001111b, 00h
    31. VIDEO_descr db 0ffh, 0ffh, 00h, 80h, 0bh, 10010010b, 01000000b, 00h
    32. GDT_size    equ $-GDT
    33.  
    34. GDTR:       dw GDT_size-1
    35.         dd GDT
    36.  
    37.  
    38. ;--------------------------------------------------------
    39. entry_point:
    40. use32
    41.                 xor eax, eax
    42.  
    43.                 mov ax, 00010000b
    44.                 mov ds, ax
    45.                 mov ss, ax
    46.  
    47.                 mov ax, 00011000b
    48.                 mov es, ax
    49.  
    50.                 mov esi, MSG
    51.                 xor edi, edi
    52.                 mov ecx, 7
    53.  
    54.                 rep movsb
    55.            
    56.         jmp $
    57.  
    58.  
    59. MSG db 'Hello!', 0
    60.  




    Так вот, в чем проблема. До команды jmp far 8:entry_point все идет хорошо. Но вот после нее все падает (т.е. vmware говорит какую-то ошибку про kernel и т.п.). Скажите, что я не так делаю? :)
     
  2. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    Не знаю, что такое "vmware", но эта программа расчитана на запуск из реального режима (дос без расширителей), а директива org 7c00h как бы намекает на то, что ее надо разместить в boot-секторе или хотя бы по адресу <any seg>:<7c00>. Видимо, надо еще почитать рядом в этой статье :)
     
  3. noxyucT

    noxyucT New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2004
    Сообщения:
    4
    VMWare - это эмулятор. То что нужно поместить в бут сектор - это понятно :) Я записываю образ на дискету и гружу ее эмулятором. Так что тут вроде все в порядке.



    Да, понял тут вдруг, что строчка не выведется, т.к. сегмент данных другой =) Это я так, к слову.
     
  4. ProgramMan

    ProgramMan New Member

    Публикаций:
    0
    Регистрация:
    13 янв 2004
    Сообщения:
    263
    естественно, читай статью еще раз

    адрес entry_point должен быть уже отнасительно сегмента, в статье должна быть расчётная формула...



    попробу сделать так

    ....

    jmp far 8:0x10000



    org 0x10000

    entry_point:

    use32

    ...

    хотя в маловероятно что сработает
     
  5. XDEV86

    XDEV86 New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2004
    Сообщения:
    5
    Сам ничего не шарил в PM, почитал cтатьи Broken Sword`а - уже ось свою пишу!

    Читайте доки - они рулезз!(C) :)

    Вот пример:


    Код (Text):
    1.  
    2. org 0x100    ; Для DOS'a
    3. ;org 0x7C00  ; Для BootSector'а
    4.  
    5. ;
    6. ; Точка входа (Реальный режим)
    7. ;
    8.   start:
    9. ;
    10. ; Включить линию A20
    11. ;
    12.         in       al,0x92
    13.         or       al,2
    14.         out      0x92,al
    15. ;
    16. ; Вычислить линейный адресс метки pm_start
    17. ;
    18.         xor     eax,eax
    19.         mov     ax,cs
    20.         shl     eax,4
    21.         add     eax,pm_start
    22.         mov     [ENTRY_OFF],eax
    23. ;
    24. ; Вычислить линейный адресс pm_start
    25. ;
    26.         xor     eax,eax
    27.         mov     ax,cs
    28.         shl     eax,4
    29.         add     ax,GDT
    30. ;
    31. ; Загрузить GDT
    32. ;
    33.         mov     dword [GDTR+2],eax
    34.         lgdt    fword [GDTR]
    35. ;
    36. ; Запретить все прерывания (включая NMI)
    37. ;
    38.         cli
    39.         in      al,0x70
    40.         or      al,0x80
    41.         out     0x70,al
    42. ;
    43. ; Перейти в защищённый режим
    44. ;
    45.         mov     eax,cr0
    46.         or      al,1
    47.         mov     cr0,eax
    48. ;
    49. ; Опкод инструкции jmp (это необходимо для загрузки секлектора кода в регистр CS)
    50. ;
    51.                 db     66h       ; префикс - изменение разрядности кода (0x66 - 32 бита)
    52.                 db     0EAh      ; опкод jmp
    53. ENTRY_OFF       dd     ?         ; куда прыгать?
    54.                 dw     00001000b ; селектор
    55. ;
    56. ; Мы в защищённом режиме :)
    57. ;
    58. use32
    59.   pm_start:
    60. ;
    61. ; Загрузим селектор (2й сегмент в таблице - данные) в сегментные регистры
    62. ;
    63.         mov     ax,16
    64.         mov     ds,ax
    65.         mov     es,ax
    66.         mov     fs,ax
    67.         mov     gs,ax
    68.         mov     ss,ax
    69.         mov     ss,ax
    70. ;
    71. ; Установим стек
    72. ;
    73.         mov     esp,STACK_TOP
    74. ;
    75. ; Вешаемся :)
    76. ;
    77.         hlt
    78. ;
    79. ; данные
    80. ;
    81. GDT:
    82. NULL_descr      db              000h,000h,00h,00h,00h,00000000b,00000000b,00h
    83. CODE_descr      db              0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
    84. DATA_descr      db              0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
    85. GDT_size        equ             $-GDT
    86.  
    87. GDTR            dw              GDT_size-1
    88.                 dd              ?
    89.  
    90. ;
    91. ; Вершина стека - 4Мб
    92. ;
    93. STACK_TOP = 1024*1024*4
    94.              
    95.  
     
  6. noxyucT

    noxyucT New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2004
    Сообщения:
    4
    В общем все дело было в эмуляторе оказывается... Он видно не очень хорошо работает =) Спасибо всем ответившим.



    XDEV86

    Вот хотел как раз по этому поводу спросить. В статье дается программа - как я понял чистый exe`шник. С сегментами там и т.п. Вот только чего не пойму - это каким образом предполагается его (по сути выполняемый файл) записывать в бут сектор? Объясните дураку... :)
     
  7. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322


    А мне за это еще и платят ;)







    Забудь про exe ! пиши через комы ;) сам (сам ! ;))) ) BS (Back Space ?) уже "осознал"... теперь тока так и пишет...

    Кидаю старые куски сорцов моей оси... (так куча всякой батвы, включая загрузку PE, работу с Fat32 и удаленную отладку через GNU Debug) но там конченный стиль написания кое-где (отголоски предидущих версий и пр.) Ща, я ее переписываю, бо эта тупая версия, но для начала сойдет...



    П.С. Кто бы сказал как внутри обработчика прерывания узнать его номер ? А то приходится ради вывода циферок с номером исключения описывать отдельные обработчики ? Наверняка есть какой-то бит порта контроллера интерраптов ? че-то не могу найти...
     
  8. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322