PMode

Тема в разделе "WASM.OS.DEVEL", создана пользователем AntiB, 24 ноя 2007.

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Доброе время суток!
    У меня проблема, я делаю переход в защищенной режим с ДОСа - всё гуд, но когда я хочу записать что-то в видеопамять - сразу ребут... в чём проблема?
    Вот код:
    Код (Text):
    1. format  MZ
    2. heap    0
    3. stack   0x800
    4. entry   _code:start
    5.  
    6.     include '..\include\pmode.inc' - описание структур
    7.  
    8. code_descr  =   (code_desc-null_desc)
    9. full_descr  =   (full_desc-null_desc)
    10. video_descr =   (video_desc-null_desc)
    11.  
    12. segment _code   use16
    13. start:
    14.     mov     ax, _gdt
    15.     mov     ds, ax
    16.  
    17.     mov     ax, 0x03
    18.     int     0x10
    19.  
    20.     cli
    21.  
    22.     in      al, 0x70
    23.     or      al, 0x80
    24.     out     0x70, al
    25.  
    26.     in      al, 0x92
    27.     or      al, 0x02
    28.     out     0x92, al
    29.  
    30.     xor     eax, eax
    31.     mov     ax, pmode
    32.     shl     eax, 0x04
    33.     add     eax, pm_entry
    34.     mov     [code_desc.base_l], ax
    35.     rol     eax, 0x10
    36.     mov     [code_desc.base_m], al
    37.  
    38.     xor     eax, eax
    39.     mov     ax, ss
    40.     shl     eax, 0x04
    41.     mov     [stack_desc.base_l], ax
    42.     rol     eax, 0x10
    43.     mov     [stack_desc.base_m], al
    44.  
    45.     xor     eax, eax
    46.     mov     ax, _gdt
    47.     shl     eax, 0x04
    48.     mov     [gdtr+0x02], eax
    49.  
    50.     lgdt    [gdtr]
    51.  
    52.     mov     eax, cr0
    53.     or      al, 1
    54.     mov     cr0, eax
    55.  
    56.     jmp     fword code_desc:pm_entry
    57.  
    58. segment pmode   use32
    59. pm_entry:
    60.     mov     ax, video_descr
    61.     mov     es, ax
    62.  
    63.     mov     byte [es:0x100], 'A'
    64.  
    65.     jmp     $
    66.  
    67. code_size   =   ($-pm_entry)
    68.  
    69. segment _gdt    use16
    70. gdt:
    71.     null_desc   desc_struc  0,0,0,0,0,0
    72.     full_desc   desc_struc  0xffff,0,0,data_acc,0,0
    73.     code_desc   desc_struc  code_size-1,0,0,code_acc,0,0
    74.     stack_desc  desc_struc  0x800-1,0,0,data_acc,0,0
    75.     video_desc  desc_struc  0x4000-1,0x8000,0x0b,data_acc,0,0
    76.  
    77. gdt_size    =   ($-gdt)
    78.  
    79. gdtr:
    80.     dw  gdt_size-1
    81.     dd  0
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Какие значения имеют code_acc, data_acc? И ребут происходит именно при записи в видеопамять?

    Вообще, Bochs хорошо помогает в таких случаях.
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    Код (Text):
    1. acc_present     =   10000000b
    2. acc_cseg        =   00011000b
    3. acc_dseg        =   00010000b
    4. acc_expdown     =   00000100b
    5. acc_conform     =   00000100b
    6. acc_datawr      =   00000010b
    7.  
    8. data_acc        =   acc_present or acc_dseg or acc_datawr
    9. code_acc        =   acc_present or acc_cseg or acc_conform
    ребут происходит когда вообще пробую записать – на данный момент писал у видео память. Bochs – ни когда не пользовался, не знаю как и он у меня не стоит.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    ну так качай и учись. че мешает.
    хорошее средство для отладки
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Great
    вполне возможно – не спорю, но может сейчас кто-то видит ошибку у меня в коде? буду очень благодарен
     
  6. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Очень жаль, но Bochs недодерживает загрузку с флешки - а мне надо именно с флешки, да и флопа у меня нету
     
  7. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    video_descr = (video_desc-null_desc)
    мне кажецо что это не равно 20h
    и тут
    jmp fword code_desc:pm_entry
    надо jmp 10h:pm_entry

    вобщем похоже ты нимного не понимаешь что такое селектор
     
  8. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Freeman
    здесь ты ошибаешься - video_descr = 0x20, а code_descr = 0x10
    Код (Text):
    1. jmp     fword code_desc:pm_entry
    здесь я сделал ошибку, надо так:
    Код (Text):
    1. jmp     fword code_descr:pm_entry
    уже выправил - но дальше ребут :dntknw:
     
  9. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    можно использовать образ в файле
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    AntiB
    Залей куда-нибудь образ флешки (если она не очень большая, если большая, то залей ту часть, где твой код есть, чтобы с этого образа можно было загрузиться), так проще разобрать будет.
     
  11. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    знач напорол с дескриптораме. попробуй последние 2 байта каждого дескриптора делоть 0с0h,00h, а не 0,0
     
  12. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    rei3er
    //offtop: а ты с АТА не разбирался? Не могу понять, как мне обнаружить правильно присутствие/отсутствие винчестеров на канале.
     
  13. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    у меня на флешке стоит ДОС :) а с под доса я уже запускаю прогу
    насчет оффтопа - если я не ошибаюсь, то надо сделать ресет девайса и потом смотреть если в ax = 00 то девайс есть, потом я брал айди девайса и тоже проверял если ax = 00 - то он есть и дальше уже работал, просто делаешь это в цикле и перебрать комбинации каналов
    Freeman
    СРАБОТАЛО!!!! СПАСИБО БОЛЬШОЕ
     
  14. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    AntiB
    Я думаю, что твой код по переключению в PM запросто влезет в 512 байт. Сделай плоский бинарник, положи его в MBR и загрузись с него. BIOS грузит код из MBR по адресу 0x7C00, так что менять особо много не придется. Bochs запросто позволит загрузиться из такого файла. А сам бинарник можешь выложить, как я и сказал, куда-нибудь, сообщество (ну по крайней мере, я :) ) посмотрит.

    При чем здесь ax? Речь не идет про BIOS -- вопрос в том, как определить наличие/отсутсвие устройства без BIOS'а.
     
  15. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    просто при сбросе устройства - выставляются регистры и надо проверять и этот способ делается без BIOS - сам так делал, Pavia рассказал об этом, за что ему респект - где то на форуме должно быть даже мой вопрос

    http://www.wasm.ru/forum/viewtopic.php?id=20088 - 8 пост от Pavia
     
  16. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    легко, тока я не буду делать MBR - если хочешь, исходники есть - переделаешь, а вот прогу - держи
    http://dump.ru/files/n/n4104231606/

    Вопрос: а как работать с прерываниями в защищенному режиме? их надо включить? (их же отключаем перед переходом)
     
  17. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    AntiB
    Хм, а что там сейчас переделывать, если все работает?

    Я прочитал это: http://wasm.ru/forum/viewtopic.php?pid=172103#p172103 Беда в том, что я не понимаю, как этот способ работает. Т.е. в стандарте подобного нет, что меня смущает.

    По прерываниям Great написал как-то статью, думаю, она может помочь.
     
  18. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    если записывать MBR - то нужна бинарник, а не MZ формат, ладно, не в этом суть

    ну не знаю - я этим способом пользовался - работает находил всё что тока мог найти

    читал, поприбивал – не вышло :dntknw:, вот сижу и думаю в чём проблема...


    Код (Text):
    1. format  MZ
    2. heap    0
    3. stack   0x800
    4. entry   _code:start
    5.  
    6.     include '..\include\pmode.inc'
    7.  
    8. code_descr  =   (code_desc-null_desc)
    9. data_descr  =   (data_desc-null_desc)
    10. video_descr =   (video_desc-null_desc)
    11.  
    12. segment _code   use16
    13. start:
    14.     mov     ax, _gdt
    15.     mov     ds, ax
    16.  
    17.     mov     ax, 0x03
    18.     int     0x10
    19.  
    20.     cli
    21.  
    22.     in      al, 0x70
    23.     or      al, 0x80
    24.     out     0x70, al
    25.  
    26.     in      al, 0x92
    27.     or      al, 0x02
    28.     out     0x92, al
    29.  
    30.     xor     eax, eax
    31.     mov     ax, pmode
    32.     shl     eax, 0x04
    33.     add     eax, pm_entry
    34.     mov     [code_desc.base_l], ax
    35.     rol     eax, 0x10
    36.     mov     [code_desc.base_m], al
    37.  
    38.     xor     eax, eax
    39.     mov     ax, _data
    40.     shl     eax, 0x04
    41.     mov     [data_desc.base_l], ax
    42.     rol     eax, 0x10
    43.     mov     [data_desc.base_m], al
    44.  
    45.     xor     eax, eax
    46.     mov     ax, ss
    47.     shl     eax, 0x04
    48.     mov     [stack_desc.base_l], ax
    49.     rol     eax, 0x10
    50.     mov     [stack_desc.base_m], al
    51.  
    52.     xor     eax, eax
    53.     mov     ax, _gdt
    54.     shl     eax, 0x04
    55.     mov     [gdtr+0x02], eax
    56.  
    57.     xor     eax, eax
    58.     mov     ax, _idt
    59.     shl     eax, 0x04
    60.     mov     [idtr+0x02], eax
    61.  
    62.     lgdt    [gdtr]
    63.     lidt    [idtr]
    64.  
    65.     mov     eax, cr0
    66.     or      al, 1
    67.     mov     cr0, eax
    68.  
    69.     jmp     fword code_descr:pm_entry
    70.  
    71. segment pmode   use32
    72. pm_entry:
    73.     mov     ax, data_descr
    74.     mov     ds, ax
    75.     mov     ax, video_descr
    76.     mov     es, ax
    77.  
    78.     in      al, 0x70
    79.     and     al, 0x7f
    80.     out     0x70, al
    81.     sti
    82.  
    83.     mov     esi, msg
    84.     int     0x01
    85.  
    86.     jmp     $
    87.  
    88. syscall_handler:
    89.     pushad
    90. _puts:
    91.     lodsb
    92.     mov     esi, [cursor]
    93.     mov     [es:edi*2], al
    94.     inc     [cursor]
    95.     test    al, al
    96.     jnz     _puts
    97.     popad
    98.     iretd
    99.  
    100. exGP_handler:
    101.     pop     eax
    102.     mov     esi, gp
    103.     int     0x01
    104.     iretd
    105.  
    106. int8_handler:
    107.     inc     byte [es:0x00]
    108.     jmp     int_EOI
    109.  
    110. int_EOI:
    111.     push    ax
    112.     mov     al, 0x20
    113.     out     0x20, al
    114.     out     0xa0, al
    115.     pop     ax
    116.     iretd
    117.  
    118. dummy:
    119.     iretd
    120.  
    121. code_size   =   ($-pm_entry)
    122.  
    123. segment _data   use32
    124. gp      db  '*** General Protection Fault ***', 0x00
    125. msg     db  'PMODE', 0x00
    126. cursor  dd  0x06
    127. data_size   =   ($-gp)
    128.  
    129. segment _gdt    use16
    130. gdt:
    131.     null_desc   desc_struc  0,0,0,0,0,0
    132.     code_desc   desc_struc  code_size-1,0,0,code_acc,0xc0,0
    133.     data_desc   desc_struc  data_size-1,0,0,data_acc,0xc0,0
    134.     stack_desc  desc_struc  0x800-1,0,0,data_acc,0xc0,0
    135.     video_desc  desc_struc  0x4000-1,0x8000,0x0b,data_acc,0xc0,0
    136.  
    137. gdt_size    =   ($-gdt)
    138.  
    139. gdtr:
    140.     dw  gdt_size-1
    141.     dd  0
    142.  
    143. segment _idt    use16
    144. idt:
    145.     exeption_01 idt_struc   dummy,code_descr,0,trap_acc,0
    146.     exeption_02 idt_struc   syscall_handler,code_descr,0,trap_acc,0
    147.     exeption_03 idt_struc   dummy,code_descr,0,trap_acc,0
    148.     exeption_04 idt_struc   dummy,code_descr,0,trap_acc,0
    149.     exeption_05 idt_struc   dummy,code_descr,0,trap_acc,0
    150.     exeption_06 idt_struc   dummy,code_descr,0,trap_acc,0
    151.     exeption_07 idt_struc   dummy,code_descr,0,trap_acc,0
    152.     exeption_08 idt_struc   dummy,code_descr,0,trap_acc,0
    153.     exeption_09 idt_struc   dummy,code_descr,0,trap_acc,0
    154.     exeption_0a idt_struc   dummy,code_descr,0,trap_acc,0
    155.     exeption_0b idt_struc   dummy,code_descr,0,trap_acc,0
    156.     exeption_0c idt_struc   dummy,code_descr,0,trap_acc,0
    157.     exeption_0d idt_struc   exGP_handler,code_descr,0,trap_acc,0
    158.     exeption_0e idt_struc   dummy,code_descr,0,trap_acc,0
    159.     exeption_0f idt_struc   dummy,code_descr,0,trap_acc,0
    160.     exeption_10 idt_struc   dummy,code_descr,0,trap_acc,0
    161.     exeption_11 idt_struc   dummy,code_descr,0,trap_acc,0
    162.     exeption_12 idt_struc   dummy,code_descr,0,trap_acc,0
    163.     exeption_13 idt_struc   dummy,code_descr,0,trap_acc,0
    164.     exeption_14 idt_struc   dummy,code_descr,0,trap_acc,0
    165.     exeption_15 idt_struc   dummy,code_descr,0,trap_acc,0
    166.     exeption_16 idt_struc   dummy,code_descr,0,trap_acc,0
    167.     exeption_17 idt_struc   dummy,code_descr,0,trap_acc,0
    168.     exeption_18 idt_struc   dummy,code_descr,0,trap_acc,0
    169.     exeption_19 idt_struc   dummy,code_descr,0,trap_acc,0
    170.     exeption_1a idt_struc   dummy,code_descr,0,trap_acc,0
    171.     exeption_1b idt_struc   dummy,code_descr,0,trap_acc,0
    172.     exeption_1c idt_struc   dummy,code_descr,0,trap_acc,0
    173.     exeption_1d idt_struc   dummy,code_descr,0,trap_acc,0
    174.     exeption_1e idt_struc   dummy,code_descr,0,trap_acc,0
    175.     exeption_1f idt_struc   dummy,code_descr,0,trap_acc,0
    176.  
    177.     irq_00      idt_struc   int8_handler,code_descr,0,int_acc,0
    178.     irq_01      idt_struc   int_EOI,code_descr,0,int_acc,0
    179.  
    180. idt_size    =   ($-idt)
    181.  
    182. idtr:
    183.     dw  idt_size-1
    184.     dd  0
    Код (Text):
    1. struc   idt_struc op1,op2,op3,op4,op5
    2. {
    3. .destoff    dw  op1
    4. .destsel    dw  op2
    5. .nparams    db  op3
    6. .access     db  op4
    7. .rsrv       dw  op5
    8. }
    может кто-то поможет? найдет ошибку... если делаю sti - ребут, если нет - то всё гуд (если самого прерывание нету)
     
  19. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Что никто не знает? Я кажется всё верно сделал, но идет ребут :dntknw: Кто ни будь может дать рабочий пример? Заранее благодарен
     
  20. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    trap_acc чему равен?

    Помимо этого: int 0x1 использовать нежелательно -- как-никак, EFLAGS.TF & DRx используют это прерывание.