Проблема с защищенным режимом.

Тема в разделе "WASM.OS.DEVEL", создана пользователем erzik, 10 фев 2007.

  1. erzik

    erzik New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    6
    Здраствуйте.
    Пишу бутсектор, разбираю переход в реальный режим...

    Код (Text):
    1. [org 0x7c00]
    2. start:
    3.  
    4. cli
    5. mov ax,cs
    6. mov ds,ax
    7. mov ss,ax
    8. mov es,ax
    9. mov sp,start
    10. mov bp,sp
    11.  
    12. lgdt [gdt_reg]
    13.  
    14. in al,92h
    15. or al,2
    16. out 92h,al
    17.  
    18. mov eax,cr0
    19. or al,1
    20. mov cr0,eax
    21.  
    22. jmp 8:protected
    23.  
    24.  
    25. [BITS 32]
    26. protected:
    27.  
    28. mov ax,10h
    29. mov ds,ax
    30. mov ss,ax
    31.  
    32. mov esi,msg_hello
    33. call kputs
    34.  
    35. hlt
    36. jmp short $
    37.  
    38.  
    39.  
    40.  
    41. kputs:
    42.  
    43. pusha
    44. .loop
    45. lodsb
    46. test al,al
    47. jz .quit
    48. mov ecx,[cursor]
    49. mov [VIDEO_RAM+ecx*2],al
    50. inc dword [cursor]
    51. jmp short .loop
    52. .quit:
    53. popa
    54. ret
    55.  
    56.  
    57.  
    58. gdt:
    59. dw 0,0,0,0
    60. db 0ffh,0ffh,0,0,0,10011010b,0cfh,0
    61. db 0ffh,0ffh,0,0,0,10010010b,0cfh,0
    62.  
    63. gdt_reg:
    64. dw 8192
    65. dd gdt
    66.  
    67. cursor:
    68. msg_hello:
    69. db "Hello from the world of 32-bit Protected Mode",10,13,0
    70.  
    71. VIDEO_RAM:
    72. dw 0b8000h
    73.  
    74.  
    75.  
    76. times 510-($-$$) db 0
    77. db 0aah,55
    Собираю код NASM'ом в boot.bin
    Эмулятор - VMware

    Теперь проблема: почему не выводится текст msg_hello?
     
  2. Kirillxskynet

    Kirillxskynet New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2006
    Сообщения:
    30
    с NASM'ом никогда не работал, но тем не менее будем надеяться что синтаксис у тебя правильный.
    dd gdt - должно равняться абсолютному адресу таблицы, лучше поставь 0 она все равно у тебя в нулевом сегменте находится.
    В дескрипторах поставь равным нулю бит D - бит разрядности операндов и адресов.
    (Это там где 0cfh стоит поставь 8fh)
    Код (Text):
    1. mov ecx,[cursor]
    2. mov [VIDEO_RAM+ecx*2],al
    3. inc dword [cursor]
    не совсем понятен этот кусок. получается что [cursor] указывает на строку?
    И еще можно запретить прерывания NMI перед переходом в защищенный режим:
    Код (Text):
    1. mov al,80h
    2. out 70h,al
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Вот мой офигенско-норкоманский исходник для FASM бутсектора с подробными комментариями, который инициализирует протектед моде, ставит IDT, разрешает прерывания и обрабатывает IRQ0 и IRQ1. Буковки, введенные на клаве, показываются на экране (регистр символов не различается, функциональные клавиши не обрабатываются). Остановка - по <Esc>. Обработчик таймера (IRQ0) меняет символ в левом верхнем углу экрана.

    ЗЫ. поскольку в 512 байт впихнуть не удалось, добавил код для чтения дополнительных секторов с диска.

    Сорс: http://gr8.cih.ms/uploads/ring0.asm

    Скриншотенг:
    [​IMG]
     
  4. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    классный экземлярчек. кто там оси пишет, можете взять за основу :))
    перехватил инт3 аналогичным способом через IDT в виндовом драйвере
     
  5. Guest

    Guest Guest

    Публикаций:
    0
    cursor: dd 0
    %define VIDEO_RAM 0xb8000

    а как ты в бутсектор пишешь?
    P.S. Я юзаю rawwrite.exe, под VMWare 5ххх все работает нормально.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    можно указать собранный .bin сразу как образ дискеты. пофиг, что он меньше 1.44Мб, будет работать. Я так делал со своим лоадером (см. пост №3)
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Код (Text):
    1. cursor:
    2. msg_hello:
    3. db "Hello from the world of 32-bit Protected Mode",10,13,0
    Видимо, имелось ввиду
    Код (Text):
    1. cursor:
    2. dd 0x0
    3. msg_hello:
    4. db "Hello from the world of 32-bit Protected Mode",10,13,0
    ?

    Да, совсем забыл: необходимо установить атрибуты литеры в видеопамяти. Т.е. добавить:
    Код (Text):
    1. kputs:
    2. ...
    3. mov ecx,[cursor]
    4. mov ah, 0x7 ;или 0xF для ярко-белого.
    5. mov [VIDEO_RAM+ecx*2],ax
    6. ...
    7. ret
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    по дефолту стоит все ок, если не забыть резетнуть экран через прерывание BIOS
     
  9. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Код (Text):
    1. по дефолту стоит все ок, если не забыть резетнуть экран через прерывание BIOS
    В коде этого нет, так что лучше добавить установку атрибутов. А код прерывания сам проставляет всем ячейкам 0x7?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Mika0x65
    ну раз он очищает экран, я предполагаю, что атрибуты выставляются. по крайней мере, смотри выше мой код - работает нормально.
     
  11. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Great
    Раз уж речь зашла, не подскажешь ссылку, где можно почитать о текстовой видеопамяти? Особо интересуют режимы (как я понял, сщуествует не только 80х25), затем, насколько я знаю, в разных режимах старший бит атрибута может отвечать либо за яркость фона либо за мигание литеры... Но где об этом можно узнать подробнее?
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да, есть еще 80x50, 40х25 и, кажется, 40х50.

    вроде бы да.

    Насчет режимов - скачай Interrupt List Ральфа Брауна, офигенная вещь. Конечно, если дружишь с английским. Там все прерывания, в том числе и INT 10 для видео.
    Там же есть и Memory List и Port List, в первом из них кажется есть немного про видеобуфер, который по линейному адресу B8000 лежит.
     
  13. St

    St New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2006
    Сообщения:
    72
    Вопрос может быть не в тему. Но все равно спрошу. Как дизассеблировать в IDA загрузчики. Перед анализом Ида спрашивает какой режим выбрать 16 или 32. Выбирю 32 ничего толкового нет, такая же ситуация с 16. Каким образом заставить ИДА совместить. ну или хотя бы правильно дизассеблировать. Мне очень интересно какой код загрузчике создали разные компиляторы (fasm, nasm под masm под masm не поробовал)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    St
    Надо просто распихать код разной разрядности по разным сегментам и соотв. сделать их use16 и use32.
    Edit -> Segments -> Edit Segment для урезания текущего сегмента и
    Edit -> Segments -> Create Segment для создания нового
     
  15. St

    St New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2006
    Сообщения:
    72
    Great
    Спасибо. Все ОК. А как правильно ntldr дизассемблировать? Оччень интересно
     
  16. Malum

    Malum New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    8
    ntldr 16-ти разрядный, но в его хвост вшит 32-х битный PE файл. У меня он по смещению 4d00h (просто ищи символы "PE"). Просто делаешь небольшую программку и вырезаешь его.
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    А че это за PE в конце... ща гляну
     
  18. St

    St New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2006
    Сообщения:
    72
    Действительно у меня по смещению 4d00h сигнатура MZ идет и какойто хитрый PE заголовок. Еще один момент IDA текстовые данные типа "ntldr испорчен не возможно загрузить страниццу" дизассеблировала, выдала код
     
  19. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
  20. St

    St New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2006
    Сообщения:
    72
    rain
    мудро