PMode

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

  1. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Код (Text):
    1. int_acc         =   acc_present or acc_int_gate
    2. trap_acc        =   acc_present or acc_trap_gate
    Код (Text):
    1. acc_present     =   10000000b
    2. acc_int_gate    =   00000110b
    3. acc_trap_gate   =   00000111b
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    мм, а ты как работаешь с этими каналами? насколько я понимаю наиболее правильный вариант это поиск контроллера на PCI шине, и уже через него запрашивать каналы.
     
  3. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Я уже добился того что при разрешение прерывание ребут не идет (irq на нужные прерывание), но почему то – дальше что-то не работает… сделал на обработчик таймера (irq0) выводился символ на экран – не работает (а если просто запустить этот обработчик – выводит)… почему так?
     
  4. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Может,
    Код (Text):
    1. acc_int_gate    =   00001110b
    2. acc_trap_gate   =   00001111b
     
  5. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    JAPH
    Кажется я всё верно сделал – но всё же, я поприбивал сделать как ты говоришь – как было так и осталось :dntknw:
     
  6. Mika0x65

    Mika0x65 New Member

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

    Код (Text):
    1. acc_int_gate    =   00001110b
    2. acc_trap_gate   =   00001111b
    +, насколько я помню, ловушками (trap) являются только int 0x1 & int 0x3, остальные -- fault, им нужен acc_int_gate.
     
  7. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    поприбивал – не вышло, и изменил всё (кроме 0х01 и 0х03) на acc_int_gate - результат тот же
     
  8. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Тогда выложи исходник (полностью, чтобы можно было собрать).
     
  9. 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. 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    fword [gdtr]
    63.     lidt    fword [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.     mov     dx, 0x20
    79.     mov     ah, 0x20
    80.     call    set_int_ctrlr
    81.  
    82.     mov     dx, 0xa0
    83.     mov     ah, 0x28
    84.     call    set_int_ctrlr
    85.  
    86.     in      al, 0x70
    87.     and     al, 0x7f
    88.     out     0x70, al
    89.     sti
    90.  
    91.     jmp     $
    92.  
    93. set_int_ctrlr:
    94.     mov     al, 11
    95.     out     dx, al
    96.     jmp     SHORT $+2
    97.     mov     al, ah
    98.     inc     dx
    99.     out     dx, al
    100.     jmp     SHORT $+2
    101.     mov     al, 4
    102.     out     dx, al
    103.     jmp     SHORT $+2
    104.     mov     al, 1
    105.     out     dx, al
    106.     jmp     SHORT $+2
    107.     mov     al, 0xff
    108.     out     dx, al
    109.     dec     dx
    110.     ret
    111.  
    112. int30h_handler:
    113.     pushad
    114.     cli
    115. _puts:
    116.     lodsb
    117.     mov     edi, [cursor]
    118.     mov     [es:edi*2], al
    119.     inc     [cursor]
    120.     test    al, al
    121.     jnz     _puts
    122.     sti
    123.     popad
    124.     ret
    125.  
    126. exGP_handler:
    127.     pop     eax
    128.     mov     esi, gp
    129.     call    int30h_handler
    130.     iretd
    131.  
    132. timer_handler:
    133.     cli
    134.     inc     byte [es:0x00]
    135.  
    136.     push    ax
    137.     mov     al, 0x20
    138.     out     0x20, al
    139.     pop     ax
    140.     sti
    141.  
    142.     iret
    143.  
    144. key_bd:
    145.     push    ecx
    146.     push    ax
    147.  
    148.     mov     al, 0xed
    149.     out     0x60, al
    150.  
    151.     mov     ecx, 0x2000
    152. delay:
    153.     loop    delay
    154.  
    155.     mov     al, 0x04
    156.     out     0x60, al
    157.  
    158.     mov     al, 0x20
    159.     out     0x20, al
    160.     pop     ax
    161.     pop     ecx
    162.     iret
    163.  
    164. dummy:
    165.     iret
    166.  
    167. dummy1:
    168.     push    ax
    169.     mov     al, 0x20
    170.     out     0x20, al
    171.     pop     ax
    172.     iret
    173.  
    174. dummy2:
    175.     push    ax
    176.     mov     al, 0x20
    177.     out     0x20, al
    178.     out     0xa0, al
    179.     pop     ax
    180.     iret
    181.  
    182. code_size   =   ($-pm_entry)
    183.  
    184. segment _data   use32
    185. gp      db  '*** General Protection Fault ***', 0x00
    186. msg     db  'PMODE', 0x00
    187. cursor  dd  0x05
    188. data_size   =   ($-gp)
    189.  
    190. segment _gdt    use16
    191. gdt:
    192.     null_desc   desc_struc  0,0,0,0,0,0
    193.     code_desc   desc_struc  code_size-1,0,0,code_acc,0xc0,0
    194.     data_desc   desc_struc  data_size-1,0,0,data_acc,0xc0,0
    195.     stack_desc  desc_struc  0x800-1,0,0,data_acc,0xc0,0
    196.     video_desc  desc_struc  0x4000-1,0x8000,0x0b,data_acc,0xc0,0
    197.  
    198. gdt_size    =   ($-gdt)
    199.  
    200. gdtr:
    201.     dw  gdt_size-1
    202.     dd  0
    203.  
    204. segment _idt    use16
    205. idt:
    206.     exeption_01 idt_struc   dummy,code_descr,0,trap_acc,0
    207.     exeption_02 idt_struc   dummy,code_descr,0,trap_acc,0
    208.     exeption_03 idt_struc   dummy,code_descr,0,trap_acc,0
    209.     exeption_04 idt_struc   dummy,code_descr,0,trap_acc,0
    210.     exeption_05 idt_struc   dummy,code_descr,0,trap_acc,0
    211.     exeption_06 idt_struc   dummy,code_descr,0,trap_acc,0
    212.     exeption_07 idt_struc   dummy,code_descr,0,trap_acc,0
    213.     exeption_08 idt_struc   dummy,code_descr,0,trap_acc,0
    214.     exeption_09 idt_struc   dummy,code_descr,0,trap_acc,0
    215.     exeption_0a idt_struc   dummy,code_descr,0,trap_acc,0
    216.     exeption_0b idt_struc   dummy,code_descr,0,trap_acc,0
    217.     exeption_0c idt_struc   dummy,code_descr,0,trap_acc,0
    218.     exeption_0d idt_struc   exGP_handler,code_descr,0,trap_acc,0
    219.     exeption_0e idt_struc   dummy,code_descr,0,trap_acc,0
    220.     exeption_0f idt_struc   dummy,code_descr,0,trap_acc,0
    221.     exeption_10 idt_struc   dummy,code_descr,0,trap_acc,0
    222.     exeption_11 idt_struc   dummy,code_descr,0,trap_acc,0
    223.     exeption_12 idt_struc   dummy,code_descr,0,trap_acc,0
    224.     exeption_13 idt_struc   dummy,code_descr,0,trap_acc,0
    225.     exeption_14 idt_struc   dummy,code_descr,0,trap_acc,0
    226.     exeption_15 idt_struc   dummy,code_descr,0,trap_acc,0
    227.     exeption_16 idt_struc   dummy,code_descr,0,trap_acc,0
    228.     exeption_17 idt_struc   dummy,code_descr,0,trap_acc,0
    229.     exeption_18 idt_struc   dummy,code_descr,0,trap_acc,0
    230.     exeption_19 idt_struc   dummy,code_descr,0,trap_acc,0
    231.     exeption_1a idt_struc   dummy,code_descr,0,trap_acc,0
    232.     exeption_1b idt_struc   dummy,code_descr,0,trap_acc,0
    233.     exeption_1c idt_struc   dummy,code_descr,0,trap_acc,0
    234.     exeption_1d idt_struc   dummy,code_descr,0,trap_acc,0
    235.     exeption_1e idt_struc   dummy,code_descr,0,trap_acc,0
    236.     exeption_1f idt_struc   dummy,code_descr,0,trap_acc,0
    237.  
    238.     irq_00      idt_struc   timer_handler,code_descr,0,int_acc,0
    239.     irq_01      idt_struc   key_bd,code_descr,0,int_acc,0
    240.     irq_02_07   idt_struc   6   dup dummy1,code_descr,0,int_acc,0
    241.     irq_08_15   idt_struc   8   dup dummy2,code_descr,0,int_acc,0
    242.  
    243. idt_size    =   ($-idt)
    244.  
    245. idtr:
    246.     dw  idt_size-1
    247.     dd  0
     
  10. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Это, конечно, круто, но где я возьму 'pmode.inc'?
     
  11. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    я тебе дам :p
    Код (Text):
    1. struc   desc_struc op1,op2,op3,op4,op5,op6
    2. {
    3. .limit_l    dw  op1
    4. .base_l     dw  op2
    5. .base_m     db  op3
    6. .access     db  op4
    7. .lim_h_f    db  op5
    8. .base_h     db  op6
    9. }
    10.  
    11. struc   idt_struc op1,op2,op3,op4,op5
    12. {
    13. .destoff    dw  op1
    14. .destsel    dw  op2
    15. .nparams    db  op3
    16. .access     db  op4
    17. .rsrv       dw  op5
    18. }
    19.  
    20. acc_present     =   10000000b
    21. acc_cseg        =   00011000b
    22. acc_dseg        =   00010000b
    23. acc_expdown     =   00000100b
    24. acc_conform     =   00000100b
    25. acc_datawr      =   00000010b
    26. acc_int_gate    =   00000110b
    27. acc_trap_gate   =   00000111b
    28.  
    29. data_acc        =   acc_present or acc_dseg or acc_datawr
    30. code_acc        =   acc_present or acc_cseg or acc_conform
    31. stack_acc       =   acc_present or acc_dseg or acc_datawr or acc_expdown
    32. idt_acc         =   acc_present or acc_dseg or acc_datawr
    33. int_acc         =   acc_present or acc_int_gate
    34. trap_acc        =   acc_present or acc_trap_gate
     
  12. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    1. Заполнение idtr - запись должна быть в сегмент _idt, а DS указывает на _gdt.
    2. 6 dup dummy, делает не то, что вы подразумеваете. Дублируется не весь список, а только dummy => corrupted descriptors.
    3. acc_int_gate = 00001110b и acc_trap_gate = 00001111b
    4. После перехода в PM проинициализируйте SS.
    5. Пределы сегментов из-за гранулярности наверняка не такие, как ожидалось.
     
  13. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Странное программирование 8259А...
    Код (Text):
    1.     mov al, 15h
    2.     out 20h, al
    3.     out 0A0h, al
    4.     mov al, 20h ; вектора
    5.     out 21h, al
    6.     mov al, 28h
    7.     out 0A1h, al
    8.     mov al, 4 ; ведущий
    9.     out 21h, al;
    10.     mov al, 2 ; ведомый
    11.     out 0A1h, al
    12.     mov al, 0Dh
    13.     out 21h, al
    14.     mov al, 9
    15.     out 0A1h, al
    16.     mov al, 0FCh ; разрешаем только IRQ0 и IRQ1
    17.     out 21h, al
    18.     mov al, 0FFh
    19.     out 0A1h, al
    В delay задержку лучше побольше.
    Код (Text):
    1.         sti
    2. @@:     hlt
    3.         jmp     @B
     
  14. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    JAPH
    1. Точно, не заметил, надо idt и gdt перенести в _data и настраивать ds на _data
    2. Может бить - переделаю
    3. хз, попробую
    4. уже сделал
    5. хз, что делать?
     
  15. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    JAPH
    Опередил :).

    AntiB
    +не хватает обработчика прерывания 0.
     
  16. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    JAPH
    первой код - не мой, содрал со статти
     
  17. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Mika0x65
    для исключение ? если да - то можно код для обработчика - небольшой?
     
  18. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Mika0x65, да, про INT0 забыл упомянуть :)

    AntiB, какой может быть обработчик деления на ноль?
     
  19. AntiB

    AntiB New Member

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

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    1) Выправил
    2) Выправил
    3) Сделал
    4) Сделал
    5) -------
    дальше обработчик таймера не работает =(