APIC

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

  1. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Здравствуйте
    может кто знает, где можно почитать о программировании APIC
    интересует внешний I/O APIC (описание local APIC есть в мануале от Intel)
     
  2. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в документациях на чипсеты, очевидно
     
  3. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Nouzui
    уже нашел
    тему новую не хочу создавать, поэтому спрошу здесь
    если IF = 0, будет ли осуществлена обработка прерывания, которое было сгенерировано Local APIC таймером?
    ИМХО да, потому как это не внешнее прерывание... но на практике получаю обратное
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.549
    Адрес:
    Russia
    IF = 0/1 запрещает или разрешает маскируемые прерывания.
    Вот и получается что таймер запрещается. Да и не только таймер...
     
  5. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    вообщет, никогда особо не интересовался
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не будет
     
  7. rei3er

    rei3er maxim

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

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    есть еще один вопрос
    ставлю Periodic mode на APIC таймер, однако срабатывает он только один раз
    т. е выводится на экран только один символ
    в чем проблема?
    Код (Text):
    1. format binary
    2.  
    3. APIC_TIMER_VECTOR = 0x21
    4.  
    5. org 7C00h
    6. use16
    7.     mov ax, 3
    8.     int 0x10
    9.     lgdt [gdtr]
    10.     cli
    11.     in  al, 0x70
    12.     or  al, 0x80
    13.     out 0x70, al   
    14.     in  al, 0x92
    15.     or  al, 2
    16.     out 0x92, al   
    17.  
    18.     mov eax, cr0
    19.     or  eax, 1 OR (1 SHL 30) OR (1 SHL 29) 
    20.     mov cr0, eax
    21.     db  0x66   
    22.     db  0xea   
    23.     dd  startup_32 
    24.     dw  1 SHL 3
    25. use32
    26. startup_32:
    27.     in  al, 0x70
    28.     and al, 0x7F
    29.     out 0x70, al
    30.     mov ecx, 0x1B
    31.     rdmsr
    32.     test    eax, 1 SHL 11
    33.     jnz @F
    34.     or  eax, 1 SHL 11
    35.     wrmsr
    36. @@:
    37.     mov ax, 2 SHL 3
    38.     mov ds, ax
    39.     mov ss, ax
    40.     mov esp, (0x0050 SHL 4) + 0x1000    ; 4Kb stack
    41.     lidt [idtr]
    42.     sti
    43.     mov dword [0xFEE00380], 0x1000 ; set initial count
    44.     or  dword [0xFEE003E0], 0x0A ; set devide mode
    45.     mov dword [0xFEE00320], APIC_TIMER_VECTOR OR (1 SHL 17) ; set periodic mode
    46. @@:
    47.         hlt
    48.     jmp @B
    49. APIC_timer_handler:
    50.     mov eax, [flags]
    51.     mov word [eax], 0x0F30
    52.     add eax, 2
    53.     cmp eax, 0xB800F
    54.     jbe @F
    55.     mov eax, 0xB800 SHL 4
    56. @@:
    57.     mov [flags], eax
    58.         mov     dword [0xFEE000B0], 0
    59.     iretd
    60. handler:
    61.     mov word [0xB800 SHL 4], 0x0F48
    62.     iretd
    63. flags:
    64.     dd  0xB800 SHL 4
    65. gdtr:
    66.     dw  GDT_TABLE_SIZE - 1
    67.     dd  gdt
    68. gdt:
    69.     dq  0x0000000000000000  ; NULL
    70.     dq  0x00CF98000000FFFF  ; 32-bit code
    71.     dq  0x00CF92000000FFFF  ; 32-bit data
    72. GDT_TABLE_SIZE = $ - gdt
    73. idtr:
    74.     dw  IDT_TABLE_SIZE - 1
    75.     dd  idt
    76. idt:
    77.     rept 33 {
    78.         dw  handler AND 0x0000FFFF
    79.         dw  1 SHL 3
    80.         db  0
    81.         db  0x8E
    82.         dw  (handler AND 0xFFFF0000) SHR 16
    83.     }
    84.     dw  APIC_timer_handler AND 0x0000FFFF
    85.     dw  1 SHL 3
    86.     db  0
    87.     db  0x8E
    88.     dw  (APIC_timer_handler AND 0xFFFF0000) SHR 16
    89. IDT_TABLE_SIZE = $ - idt
     
  9. rei3er

    rei3er maxim

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

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

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    В чём была проблема?
    EOI не слал?
    Потому что в Bochs у меня он только один раз срабатывает. В qemu всё ок.
     
  11. wasm_test

    wasm_test wasm test user

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

    Pavia Well-Known Member

    Публикаций:
    0
    Регистрация:
    17 июн 2003
    Сообщения:
    2.409
    Адрес:
    Fryazino
    Great
    Вроде нормально стал сейчас. Правда с APIC у него туго.
     
  13. SII

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

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