PMode

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

  1. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    А у меня работает :) Показываем, как выправили
     
  2. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    JAPH
    вот блин :)
    Код (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. stack_descr =   (stack_desc-null_desc)
    11. video_descr =   (video_desc-null_desc)
    12.  
    13. segment _code   use16
    14. start:
    15.     mov     ax, _gdt
    16.     mov     ds, ax
    17.  
    18.     mov     ax, 0x03
    19.     int     0x10
    20.  
    21.     cli
    22.  
    23.     in      al, 0x70
    24.     or      al, 0x80
    25.     out     0x70, al
    26.  
    27.     in      al, 0x92
    28.     or      al, 0x02
    29.     out     0x92, al
    30.  
    31.     xor     eax, eax
    32.     mov     ax, pmode
    33.     shl     eax, 0x04
    34.     add     eax, pm_entry
    35.     mov     [code_desc.base_l], ax
    36.     rol     eax, 0x10
    37.     mov     [code_desc.base_m], al
    38.  
    39.     xor     eax, eax
    40.     mov     ax, _data
    41.     shl     eax, 0x04
    42.     mov     [data_desc.base_l], ax
    43.     rol     eax, 0x10
    44.     mov     [data_desc.base_m], al
    45.  
    46.     xor     eax, eax
    47.     mov     ax, ss
    48.     shl     eax, 0x04
    49.     mov     [stack_desc.base_l], ax
    50.     rol     eax, 0x10
    51.     mov     [stack_desc.base_m], al
    52.  
    53.     mov     ax, _data
    54.     mov     ds, ax
    55.  
    56.     xor     eax, eax
    57.     mov     ax, _gdt
    58.     shl     eax, 0x04
    59.     mov     [gdtr+0x02], eax
    60.  
    61.     xor     eax, eax
    62.     mov     ax, _idt
    63.     shl     eax, 0x04
    64.     mov     [idtr+0x02], eax
    65.  
    66.     lgdt    fword [gdtr]
    67.     lidt    fword [idtr]
    68.  
    69.     mov     eax, cr0
    70.     or      al, 1
    71.     mov     cr0, eax
    72.  
    73.     jmp     fword code_descr:pm_entry
    74.  
    75. segment pmode   use32
    76. pm_entry:
    77.     mov     ax, data_descr
    78.     mov     ds, ax
    79.     mov     ax, stack_descr
    80.     mov     ss, ax
    81.     mov     ax, video_descr
    82.     mov     es, ax
    83.  
    84.     mov     dx, 0x20
    85.     mov     ah, 0x20
    86.     call    set_int_ctrlr
    87.  
    88.     mov     dx, 0xa0
    89.     mov     ah, 0x28
    90.     call    set_int_ctrlr
    91.  
    92.     in      al, 0x70
    93.     and     al, 0x7f
    94.     out     0x70, al
    95.     sti
    96.  
    97.     jmp     $
    98.  
    99. set_int_ctrlr:
    100.     mov     al, 11
    101.     out     dx, al
    102.     jmp     SHORT $+2
    103.     mov     al, ah
    104.     inc     dx
    105.     out     dx, al
    106.     jmp     SHORT $+2
    107.     mov     al, 4
    108.     out     dx, al
    109.     jmp     SHORT $+2
    110.     mov     al, 1
    111.     out     dx, al
    112.     jmp     SHORT $+2
    113.     mov     al, 0xff
    114.     out     dx, al
    115.     dec     dx
    116.     ret
    117.  
    118. int30h_handler:
    119.     pushad
    120.     cli
    121. _puts:
    122.     lodsb
    123.     mov     edi, [cursor]
    124.     mov     [es:edi*2], al
    125.     inc     [cursor]
    126.     test    al, al
    127.     jnz     _puts
    128.     sti
    129.     popad
    130.     ret
    131.  
    132. exGP_handler:
    133.     pop     eax
    134.     mov     esi, gp
    135.     call    int30h_handler
    136.     iretd
    137.  
    138. timer_handler:
    139.     cli
    140.     inc     byte [es:0x00]
    141.  
    142.     push    ax
    143.     mov     al, 0x20
    144.     out     0x20, al
    145.     pop     ax
    146.     sti
    147.  
    148.     iret
    149.  
    150. key_bd:
    151.     push    ecx
    152.     push    ax
    153.  
    154.     mov     al, 0xed
    155.     out     0x60, al
    156.  
    157.     mov     ecx, 0x2000
    158. delay:
    159.     loop    delay
    160.  
    161.     mov     al, 0x04
    162.     out     0x60, al
    163.  
    164.     mov     al, 0x20
    165.     out     0x20, al
    166.     pop     ax
    167.     pop     ecx
    168.     iret
    169.  
    170. dummy:
    171.     iret
    172.  
    173. dummy1:
    174.     push    ax
    175.     mov     al, 0x20
    176.     out     0x20, al
    177.     pop     ax
    178.     iret
    179.  
    180. dummy2:
    181.     push    ax
    182.     mov     al, 0x20
    183.     out     0x20, al
    184.     out     0xa0, al
    185.     pop     ax
    186.     iret
    187.  
    188. code_size   =   ($-pm_entry)
    189.  
    190. segment _data   use32
    191. gp      db  '*** General Protection Fault ***', 0x00
    192. msg     db  'PMODE', 0x00
    193. cursor  dd  0x05
    194. data_size   =   ($-gp)
    195.  
    196. gdtr:
    197.     dw  gdt_size-1
    198.     dd  0
    199.  
    200. idtr:
    201.     dw  idt_size-1
    202.     dd  0
    203.  
    204. segment _gdt    use16
    205. gdt:
    206.     null_desc   desc_struc  0,0,0,0,0,0
    207.     code_desc   desc_struc  code_size-1,0,0,code_acc,0xc0,0
    208.     data_desc   desc_struc  data_size-1,0,0,data_acc,0xc0,0
    209.     stack_desc  desc_struc  0x800-1,0,0,data_acc,0xc0,0
    210.     video_desc  desc_struc  0x4000-1,0x8000,0x0b,data_acc,0xc0,0
    211.  
    212. gdt_size    =   ($-gdt)
    213.  
    214. segment _idt    use16
    215. idt:
    216.     exeption_01 idt_struc   dummy,code_descr,0,trap_acc,0
    217.     exeption_02 idt_struc   dummy,code_descr,0,trap_acc,0
    218.     exeption_03 idt_struc   dummy,code_descr,0,trap_acc,0
    219.     exeption_04 idt_struc   dummy,code_descr,0,trap_acc,0
    220.     exeption_05 idt_struc   dummy,code_descr,0,trap_acc,0
    221.     exeption_06 idt_struc   dummy,code_descr,0,trap_acc,0
    222.     exeption_07 idt_struc   dummy,code_descr,0,trap_acc,0
    223.     exeption_08 idt_struc   dummy,code_descr,0,trap_acc,0
    224.     exeption_09 idt_struc   dummy,code_descr,0,trap_acc,0
    225.     exeption_0a idt_struc   dummy,code_descr,0,trap_acc,0
    226.     exeption_0b idt_struc   dummy,code_descr,0,trap_acc,0
    227.     exeption_0c idt_struc   dummy,code_descr,0,trap_acc,0
    228.     exeption_0d idt_struc   exGP_handler,code_descr,0,trap_acc,0
    229.     exeption_0e idt_struc   dummy,code_descr,0,trap_acc,0
    230.     exeption_0f idt_struc   dummy,code_descr,0,trap_acc,0
    231.     exeption_10 idt_struc   dummy,code_descr,0,trap_acc,0
    232.     exeption_11 idt_struc   dummy,code_descr,0,trap_acc,0
    233.     exeption_12 idt_struc   dummy,code_descr,0,trap_acc,0
    234.     exeption_13 idt_struc   dummy,code_descr,0,trap_acc,0
    235.     exeption_14 idt_struc   dummy,code_descr,0,trap_acc,0
    236.     exeption_15 idt_struc   dummy,code_descr,0,trap_acc,0
    237.     exeption_16 idt_struc   dummy,code_descr,0,trap_acc,0
    238.     exeption_17 idt_struc   dummy,code_descr,0,trap_acc,0
    239.     exeption_18 idt_struc   dummy,code_descr,0,trap_acc,0
    240.     exeption_19 idt_struc   dummy,code_descr,0,trap_acc,0
    241.     exeption_1a idt_struc   dummy,code_descr,0,trap_acc,0
    242.     exeption_1b idt_struc   dummy,code_descr,0,trap_acc,0
    243.     exeption_1c idt_struc   dummy,code_descr,0,trap_acc,0
    244.     exeption_1d idt_struc   dummy,code_descr,0,trap_acc,0
    245.     exeption_1e idt_struc   dummy,code_descr,0,trap_acc,0
    246.     exeption_1f idt_struc   dummy,code_descr,0,trap_acc,0
    247.  
    248.     irq_00      idt_struc   timer_handler,code_descr,0,int_acc,0
    249.     irq_01      idt_struc   key_bd,code_descr,0,int_acc,0
    250.     irq_02      idt_struc   dummy1,code_descr,0,int_acc,0
    251.     irq_03      idt_struc   dummy1,code_descr,0,int_acc,0
    252.     irq_04      idt_struc   dummy1,code_descr,0,int_acc,0
    253.     irq_05      idt_struc   dummy1,code_descr,0,int_acc,0
    254.     irq_06      idt_struc   dummy1,code_descr,0,int_acc,0
    255.     irq_07      idt_struc   dummy1,code_descr,0,int_acc,0
    256.     irq_08      idt_struc   dummy2,code_descr,0,int_acc,0
    257.     irq_09      idt_struc   dummy2,code_descr,0,int_acc,0
    258.     irq_10      idt_struc   dummy2,code_descr,0,int_acc,0
    259.     irq_11      idt_struc   dummy2,code_descr,0,int_acc,0
    260.     irq_12      idt_struc   dummy2,code_descr,0,int_acc,0
    261.     irq_13      idt_struc   dummy2,code_descr,0,int_acc,0
    262.     irq_14      idt_struc   dummy2,code_descr,0,int_acc,0
    263.     irq_15      idt_struc   dummy2,code_descr,0,int_acc,0
    264.  
    265. idt_size    =   ($-idt)
    Код (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    =   00001110b
    27. acc_trap_gate   =   00001111b
    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
     
  3. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    В том-то и дело, что не dummy. Точнее, dummy, но при отсутствии 32 обработчиков исключений, обработчики прерываний "смещаются". В результате получается, что обработчик 32ого прерывания становится 31ым. Т.е. надо добавить:

    Код (Text):
    1. exeption_00 idt_struc   dummy,code_descr,0,trap_acc,0
     
  4. AntiB

    AntiB New Member

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

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Невнимательность?
    Код (Text):
    1. idt:
    2.     exeption_00 idt_struc   dummy,code_descr,0,trap_acc,0
    3.     exeption_01 idt_struc   dummy,code_descr,0,trap_acc,0
    Mika0x65, опередил :)
     
  6. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    Мой вариант - для загрузочного сектора. Трохи переделать надо. useXX - когда-то был segment
    Код (Text):
    1. include 'pmode.inc'
    2.  
    3. code_descr  =   (code_desc-null_desc)
    4. data_descr  =   (data_desc-null_desc)
    5. video_descr =   (video_desc-null_desc)
    6. stack_descr =   (stack_desc-null_desc)
    7.     use16
    8.     mov ax, 0208h ; грузим прогу по адресу 8000h
    9.     mov cx, 0002h
    10.     xor bx, bx
    11.     push    800h
    12.     pop es
    13.     mov dx, 80h
    14.     int 13h
    15.     jmp 0800h:0
    16.     align   512
    17.     store word 0AA55h at $ - 2
    18. ; оригинал
    19.     use16
    20.     org 0
    21. pmode = 820h
    22. _data = 840h
    23. _gdt = 860h
    24. _idt = 880h
    25. start:
    26.     mov     ax, _gdt
    27.     mov     ds, ax
    28.     mov ax, _idt
    29.     mov es, ax
    30.     mov     ax, 0x03
    31.     int     0x10
    32.  
    33.     cli
    34.     in      al, 0x70
    35.     or      al, 0x80
    36.     out     0x70, al
    37.  
    38.     in      al, 0x92
    39.     or      al, 0x02
    40.     out     0x92, al
    41.  
    42.     xor     eax, eax
    43.     mov     ax, pmode
    44.     shl     eax, 0x04
    45.     add     eax, pm_entry
    46.     mov     [code_desc.base_l], ax
    47.     rol     eax, 0x10
    48.     mov     [code_desc.base_m], al
    49.    
    50.  
    51.     xor     eax, eax
    52.     mov     ax, _data
    53.     shl     eax, 0x04
    54.     mov     [data_desc.base_l], ax
    55.     rol     eax, 0x10
    56.     mov     [data_desc.base_m], al
    57.  
    58.     xor     eax, eax
    59.     mov     ax, ss
    60.     shl     eax, 0x04
    61.     mov     [stack_desc.base_l], ax
    62.     rol     eax, 0x10
    63.     mov     [stack_desc.base_m], al
    64.  
    65.     xor     eax, eax
    66.     mov     ax, _gdt
    67.     shl     eax, 0x04
    68.     mov     [gdtr+0x02], eax
    69.  
    70.     xor     eax, eax
    71.     mov     ax, _idt
    72.     shl     eax, 0x04
    73.     mov     [es:idtr+0x02], eax
    74.  
    75.     lgdt    fword [gdtr]
    76.     lidt    fword [es:idtr]
    77.  
    78.     mov     eax, cr0
    79.     or      al, 1
    80.     mov     cr0, eax
    81.  
    82.     jmp     fword code_descr:pm_entry
    83.  
    84.     use32
    85.     align   512
    86.     org 0
    87. pm_entry:
    88.     mov     ax, data_descr
    89.     mov     ds, ax
    90.     mov     ax, video_descr
    91.     mov     es, ax
    92.     mov ax, stack_descr
    93.     mov ss, ax
    94.     mov al, 15h
    95.     out 20h, al
    96.     out 0A0h, al
    97.     mov al, 20h
    98.     out 21h, al
    99.     mov al, 28h
    100.     out 0A1h, al
    101.     mov al, 4
    102.     out 21h, al;
    103.     mov al, 2
    104.     out 0A1h, al
    105.     mov al, 0Dh
    106.     out 21h, al
    107.     mov al, 9
    108.     out 0A1h, al
    109.     mov al, 0FCh
    110.     out 21h, al
    111.     mov al, 0FFh
    112.     out 0A1h, al
    113.  
    114.     in      al, 0x70
    115.     and     al, 0x7f
    116.     out     0x70, al
    117.     sti
    118. @@: hlt
    119.     jmp     @B
    120.  
    121.    
    122.  
    123. int30h_handler:
    124.     pushad
    125.     cli
    126. _puts:
    127.     lodsb
    128.     mov     edi, [cursor]
    129.     mov     [es:edi*2], al
    130.     inc     [cursor]
    131.     test    al, al
    132.     jnz     _puts
    133.     sti
    134.     popad
    135.     ret
    136.  
    137. exGP_handler:
    138.     pop     eax
    139.     mov     esi, gp
    140.     ;call   int30h_handler
    141.     iretd
    142.  
    143. timer_handler:
    144.     cli
    145.     inc     byte [es:0x00]
    146.  
    147.     push    ax
    148.     mov     al, 0x20
    149.     out     0x20, al
    150.     pop     ax
    151.     sti
    152.  
    153.     iret
    154.  
    155. key_bd:
    156.     push    ecx
    157.     push    ax
    158.  
    159.     mov     al, 0xed
    160.     out     0x60, al
    161.  
    162.     mov     ecx, 0x2000000
    163. delay:
    164.     loop    delay
    165.  
    166.     mov     al, 0x04
    167.     out     0x60, al
    168.  
    169.     mov     al, 0x20
    170.     out     0x20, al
    171.     pop     ax
    172.     pop     ecx
    173.     iret
    174.  
    175. dummy:
    176.     iret
    177.  
    178. dummy1:
    179.     push    ax
    180.     mov     al, 0x20
    181.     out     0x20, al
    182.     pop     ax
    183.     iret
    184.  
    185. dummy2:
    186.     push    ax
    187.     mov     al, 0x20
    188.     out     0x20, al
    189.     out     0xa0, al
    190.     pop     ax
    191.     iret
    192.  
    193. code_size   =   ($-pm_entry)
    194.  
    195.     use32
    196.     align   512
    197. gp      db  '*** General Protection Fault ***', 0x00
    198. msg     db  'PMODE', 0x00
    199. cursor  dd  0x05
    200. data_size   =   ($-gp)
    201.  
    202.     use16
    203.     align   512
    204.     org 0
    205. gdt:
    206.     null_desc   desc_struc  0,0,0,0,0,0
    207.     code_desc   desc_struc  code_size-1,0,0,code_acc,0xc0,0
    208.     data_desc   desc_struc  data_size-1,0,0,data_acc,0xc0,0
    209.     stack_desc  desc_struc  0x800-1,0,0,data_acc,0xc0,0
    210.     video_desc  desc_struc  0x4000-1,0x8000,0x0b,data_acc,0xc0,0
    211.  
    212. gdt_size    =   ($-gdt)
    213.  
    214. gdtr:
    215.     dw  gdt_size-1
    216.     dd  0
    217.  
    218.     use16
    219.     align   512
    220.     org 0
    221. idt:
    222.     exeption_00 idt_struc   dummy,code_descr,0,trap_acc,0
    223.     exeption_01 idt_struc   dummy,code_descr,0,trap_acc,0
    224.     exeption_02 idt_struc   dummy,code_descr,0,trap_acc,0
    225.     exeption_03 idt_struc   dummy,code_descr,0,trap_acc,0
    226.     exeption_04 idt_struc   dummy,code_descr,0,trap_acc,0
    227.     exeption_05 idt_struc   dummy,code_descr,0,trap_acc,0
    228.     exeption_06 idt_struc   dummy,code_descr,0,trap_acc,0
    229.     exeption_07 idt_struc   dummy,code_descr,0,trap_acc,0
    230.     exeption_08 idt_struc   dummy,code_descr,0,trap_acc,0
    231.     exeption_09 idt_struc   dummy,code_descr,0,trap_acc,0
    232.     exeption_0a idt_struc   dummy,code_descr,0,trap_acc,0
    233.     exeption_0b idt_struc   dummy,code_descr,0,trap_acc,0
    234.     exeption_0c idt_struc   dummy,code_descr,0,trap_acc,0
    235.     exeption_0d idt_struc   exGP_handler,code_descr,0,trap_acc,0
    236.     exeption_0e idt_struc   dummy,code_descr,0,trap_acc,0
    237.     exeption_0f idt_struc   dummy,code_descr,0,trap_acc,0
    238.     exeption_10 idt_struc   dummy,code_descr,0,trap_acc,0
    239.     exeption_11 idt_struc   dummy,code_descr,0,trap_acc,0
    240.     exeption_12 idt_struc   dummy,code_descr,0,trap_acc,0
    241.     exeption_13 idt_struc   dummy,code_descr,0,trap_acc,0
    242.     exeption_14 idt_struc   dummy,code_descr,0,trap_acc,0
    243.     exeption_15 idt_struc   dummy,code_descr,0,trap_acc,0
    244.     exeption_16 idt_struc   dummy,code_descr,0,trap_acc,0
    245.     exeption_17 idt_struc   dummy,code_descr,0,trap_acc,0
    246.     exeption_18 idt_struc   dummy,code_descr,0,trap_acc,0
    247.     exeption_19 idt_struc   dummy,code_descr,0,trap_acc,0
    248.     exeption_1a idt_struc   dummy,code_descr,0,trap_acc,0
    249.     exeption_1b idt_struc   dummy,code_descr,0,trap_acc,0
    250.     exeption_1c idt_struc   dummy,code_descr,0,trap_acc,0
    251.     exeption_1d idt_struc   dummy,code_descr,0,trap_acc,0
    252.     exeption_1e idt_struc   dummy,code_descr,0,trap_acc,0
    253.     exeption_1f idt_struc   dummy,code_descr,0,trap_acc,0
    254.  
    255.     irq_00      idt_struc   timer_handler,code_descr,0,int_acc,0
    256.     irq_01      idt_struc   key_bd,code_descr,0,int_acc,0
    257.     irq_02_07   idt_struc   dummy1,code_descr,0,int_acc,0
    258.     a1      idt_struc   dummy1,code_descr,0,int_acc,0
    259.     a2      idt_struc   dummy1,code_descr,0,int_acc,0
    260.     a3      idt_struc   dummy1,code_descr,0,int_acc,0
    261.     a4      idt_struc   dummy1,code_descr,0,int_acc,0
    262.     a5      idt_struc   dummy1,code_descr,0,int_acc,0
    263.     irq_08_15   idt_struc   dummy2,code_descr,0,int_acc,0
    264.     a6      idt_struc   dummy2,code_descr,0,int_acc,0
    265.     a7      idt_struc   dummy2,code_descr,0,int_acc,0
    266.     a8      idt_struc   dummy2,code_descr,0,int_acc,0
    267.     a9      idt_struc   dummy2,code_descr,0,int_acc,0
    268.     a0      idt_struc   dummy2,code_descr,0,int_acc,0
    269.     a11     idt_struc   dummy2,code_descr,0,int_acc,0
    270.     a12     idt_struc   dummy2,code_descr,0,int_acc,0
    271.  
    272. idt_size    =   ($-idt)
    273.  
    274. idtr:
    275.     dw  idt_size-1
    276.     dd  0
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    + так и не исправлена маскировка прерываний:
    Код (Text):
    1. set_int_ctrlr:
    2.     mov     al, 11
    3.     out     dx, al
    4.     jmp     SHORT $+2
    5.     mov     al, ah
    6.     inc     dx
    7.     out     dx, al
    8.     jmp     SHORT $+2
    9.     mov     al, 4
    10.     out     dx, al
    11.     jmp     SHORT $+2
    12.     mov     al, 1
    13.     out     dx, al
    14.     jmp     SHORT $+2
    15.     mov     al, 0xFC ;<=======================здесь
    16.     out     dx, al
    17.     dec     dx
    18.     ret
     
  8. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Работает :)))
    Спасибо БОЛЬШОЕ Mika0x65 и JAPH

    оффтоп: может есть доки по APIC и 8259А ??
     
  9. Mika0x65

    Mika0x65 New Member

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

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    спасибо ищо раз
     
  11. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    APIC - читай Intel Manual. Хотя если не рассчитываешь ядро как SMP, тебе его нету смысла пока трогать.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Да и вдаваться во все детали программирования PIC смысла нет, т.к. практически всегда используется лишь один режим его работы. Главное, правильно проинициализировать PIC в этом режиме.
    Код (Text):
    1. ; ---------------------------------------------------------------------------
    2. ; Перепрограммирование контроллера прерываний
    3. ; ---------------------------------------------------------------------------
    4. ; На входе:
    5. ; bl - индекс обработчика для IRQ0 (должен быть кратен восьми)
    6. ; bh - индекс обработчика для IRQ8 (должен быть кратен восьми)
    7. ; dx - битовая маска для IRQ0-IRQ15 (0 - разрешение, 1 - запрет)
    8. ; ---------------------------------------------------------------------------
    9. ; На выходе: нет
    10. ; ---------------------------------------------------------------------------
    11. ; Используемые регистры: al
    12. ; ---------------------------------------------------------------------------
    13. reset_pic:
    14.         mov     al, 00010001b
    15.         out     20h, al
    16.         out     0A0h, al
    17.  
    18.         mov     al, bl
    19.         out     21h, al
    20.         mov     al, bh
    21.         out     0A1h, al
    22.  
    23.         mov     al, 00000100b
    24.         out     21h, al
    25.         mov     al, 02h
    26.         out     0A1h, al
    27.  
    28.         mov     al, 00001101b
    29.         out     21h, al
    30.         mov     al, 00001001b
    31.         out     0A1h, al
    32.  
    33.         mov     al, dl
    34.         out     21h, al
    35.         mov     al, dh
    36.         out     0A1h, al
    37.  
    38.         ret
    После этого про его программирование можно забыть за исключением того, что нужно посылать EOI во время обработки каждого прерывания, причем в некоторых случаях дважды.
     
  13. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    SadKo
    читаю, жаль, что на русском нету
    Phantom_84
    Большое Спасибо за код.
    можешь рассказать об этих случаях на будущее?
     
  14. Pavia

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Phantom_84
    А почему бы не настроить PIC чтобы она сам отпровлял EOI ? PIC поддерживает автоматическую отправку EOI.
     
  15. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Pavia
    как это сделать? подскажите, если не тяжело
     
  16. Phantom_84

    Phantom_84 New Member

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

    Pavia, в режиме с автоматическим подтверждением обработки прерываний есть свои сложности.
     
  17. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    Phantom_84
    об каких сложностях ты говоришь при автоматическим подтверждениям обработки прерывань?
     
  18. AntiB

    AntiB New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2007
    Сообщения:
    393
    как сделать чтобы делалась автоматически подтверждения обработки прерывание?
     
  19. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    AntiB

    Можно перепрограммировать контроллер прерываний, но это "черевато боком". В общем, лучше такой "автоматизацией" не заниматься.

    Если склероз не изменяет, при автоматическом подтверждении возможна некорректная работа, если на одну и ту же линию завязаны несколько источников прерываний. Но утверждать не буду -- давно наталкивался на проблемы, уже и не помню, но точно помню, что в конечном счёте пришёл к выводу: "автоматика" больше мешает, чем помогает.
     
  20. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    APIC имеет ряд преимуществ даже на однопроцессорной машине, так что ознакомиться с ним по меньшей мере полезно.