OSDev

для всех
Текущее время: 01 май 2024, 21:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: SMP, переназначение прерываний
СообщениеДобавлено: 18 мар 2012, 22:54 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Только что настроил LocalAPIC на всех процессорах, после чего межпроцессорные прерывания наконец заработали. Но теперь другая проблема: вне зависимости от того, настраиваю я IOAPIC или нет, прерывание таймера приходит на случайный процессор (чаще всего на первый; на нулевой, второй и третий крайне редко).
Код настройки, который не работает:
Код:
      mov rax, [IOAPICAddr]
      mov [rax+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOAPICID
      mov [rax+IOAPIC_IOWIN_REG], dword 04000000h

      mov [rax+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_hi
      mov [rax+IOAPIC_IOWIN_REG], dword (02h shl 24)     ; Send to 2nd core
      mov [rax+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_low
      mov [rax+IOAPIC_IOWIN_REG], dword 20h

В начале инициализации (задолго до этого кода, ещё в x16) я использую переназначение прерываний через PIC:
Код:
        mov al, 00010001b               ; begin PIC 1 initialization
        out 0x20, al
        mov al, 00010001b               ; begin PIC 2 initialization
        out 0xA0, al
        mov al, 0x20                    ; IRQ 0-7: interrupts 20h-27h
        out 0x21, al
        mov al, 0x28                    ; IRQ 8-15: interrupts 28h-2Fh
        out 0xA1, al
        mov al, 4
        out 0x21, al
        mov al, 2
        out 0xA1, al
        mov al, 1
        out 0x21, al
        out 0xA1, al

        in al, 0x21
        mov al, 11111111b               ; Disable all IRQs
        out 0x21, al
        in al, 0xA1
        mov al, 11111111b
        out 0xA1, al

Но если этот код убрать и использовать только ту попытку через IOAPIC, то прерывания не переназначаются (по таймеру якобы происходит 8 исключение).
ЧЯДНТ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 03:52 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Я сейчас читаю про апик, тоже хочется 24 прерывания и доступ к процессорам, тем более что книжка нашлась по этой теме, но я в 32битном режиме, через апик можно получить инфу о процессорах.
У тебя сколько 3 процессора? АМДшка чтоли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 10:01 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Станислав писал(а):
Я сейчас читаю про апик, тоже хочется 24 прерывания и доступ к процессорам, тем более что книжка нашлась по этой теме, но я в 32битном режиме, через апик можно получить инфу о процессорах.
У тебя сколько 3 процессора? АМДшка чтоли?

У меня 4 процессора (индексы 0..3), и это QEMU :). Разницы между х32 и х64 тут быть не должно, т.к. апик все-таки внешнее устройство. Локальные APIC вроде настроил, а IO никак.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 16:08 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Эта небольшая заметка может помочь
https://docs.google.com/document/d/1DE5 ... Qs940/edit


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 17:57 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Himik писал(а):
Эта небольшая заметка может помочь

Увы, не помогла.
Написал такой код:
Код:
        in al, 0x21
        mov al, 11111111b               ; Disable all IRQs
        out 0x21, al
        in al, 0xA1
        mov al, 11111111b
        out 0xA1, al
 
     ......   

      mov rsi, [LAPICAddr]
      mov eax, [rsi+APIC_SPUR_REG]  ; Setup Spurious interrupt vector
      and eax, (not 01FFh)
      or  eax, (0100h or 030h)
      mov [rsi+APIC_SPUR_REG], eax

      mov eax, [rsi+APIC_LVT_LINT0_REG]  ; Setup LINT0
      and eax, 0FFFE58FFh
      mov [rsi+APIC_LVT_LINT0_REG], eax

      mov eax, [rsi+APIC_LVT_LINT1_REG]  ; Setup LINT1
      and eax, 0FFFE58FFh
      or  eax, 0400h
      mov [rsi+APIC_LVT_LINT1_REG], eax

      mov [rsi+APIC_TPR], dword 20h  ; TaskPriority, ставил разные
      mov [rsi+APIC_LVT_Timer_REG], dword 10000h  ; Shut down timer
      mov [rsi+APIC_PMC_REG], dword 10000h ; Shut down performance monitor
      mov [rsi+APIC_ERROR_REG], dword 10000h ; Shut down error interrupt
      mov eax, [rsi+20h]
      mov [rsi+APIC_LDR_REG], dword eax ; Setup logical ID
      mov [rsi+APIC_DFR_REG], dword (0Fh shl 28) ; Setup DFR mask

      mov    al, 70h
      out    22h, al
      mov    al, 01h
      out    23h, al

      mov rsi, [IOAPICAddr]
      ;mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOAPICID ; Эти две строки и раскомментировал, и снова убирал.
      ;mov [rsi+IOAPIC_IOWIN_REG], dword 04000000h

      mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_low
      mov [rsi+IOAPIC_IOWIN_REG], dword (1 shl 16)
      mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL0_hi
      mov [rsi+IOAPIC_IOWIN_REG], dword (00h shl 24)
sti

Прерывания PIC запрещены. Дополнительные ядра не запускаю. После "sti" получаю как бы Exception 0Fh (который зарезервирован). Прерывание 0 замаскировал (в заметке пишут, что туда подключен PIC), остальные и так должны быть маскированы.

UPD: попробовал вручную всё замаскировать:
Код:
mov rbx, IOAPIC_IOREDTBL0_low
      mov rcx, 24
      @@:
        mov [rsi+IOAPIC_IOREGSEL_REG], dword ebx
        mov [rsi+IOAPIC_IOWIN_REG], dword (1 shl 16)    ; low
        inc rbx
        mov [rsi+IOAPIC_IOREGSEL_REG], dword ebx
        mov [rsi+IOAPIC_IOWIN_REG], dword (00h shl 24)  ; high
        inc rbx
      loop @b

Не помогло.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 18:41 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Попробуй запустить в Bochs. Он при ошибках сообщает много отладочной информации. Журнал ошибок смотри в файле bochsout.txt, который создаётся после каждого запуска (даже при отсутствии ошибок).

Это в данном случае ни на что не влияет, но лучше исправить. У "Spurious interrupt vector" последняя цифра номера обязательно должна быть F.

Кстати в IOAPIC по умолчанию (если ничего не настраивать) все прерывания замаскированы. Попробуй ничего в регистры не записывать - должна быть "тишина". Затем пробуй постепенно по одному прерыванию настраивать и смотреть реакцию.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 19:30 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Поправил spurious.
С BOCHS там затыки, в свое время от него отказался. Память он нормально не эмулирует.

Так. Тишины добился. При размаскировании клавиатуры 0 эмоций, при размаскировании таймера - только Spurious прерывание.
В доках пишут, что это прерывание может возникнуть если TaskPriority = Interrupt Priority. Понизил TP - пропало. Значит какие-то движения есть... Но все же самого размаскированного прерывания нет.
Продолжаю эксперименты.

UPD: Мапаю прерывание через IOAPIC на какой-нибудь эксепшен (любой в [0..1Fh])- он происходит. Причем вне зависимости от того, было ли само прерывание (мапаю одно любое, хоть таймер, хоть клавиатуру, хоть что-либо еще - сразу случается эксепшен, указанный как вектор). Если же мапаю на что-нибудь адекватное - ничего не происходит.

UPD2: Наконец-то. Спасибо огромное, Himik. :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 20:57 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Гуд. И всё-же попробуй новую версию Bochs 2.5.1
http://sourceforge.net/projects/bochs
Ни каких проблем с памятью я что-то не замечал.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 21:16 

Зарегистрирован: 31 окт 2011, 18:20
Сообщения: 230
Himik писал(а):
Ни каких проблем с памятью я что-то не замечал.

Как выставить объем памяти больше 1 мб? Он мне не позволяет... А еще одну виртуалку в наборе иметь бы хотелось.
З.Ы. если кому-то понадобится решение:
Код:
      mov rsi, [IOAPICAddr]   ; Here we have current IOAPIC address
      mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL2_low  ; SysTimer
      mov [rsi+IOAPIC_IOWIN_REG], dword 20h+(0b shl 11)+(0 shl 16)  ; Redirect to 20h 
      mov [rsi+IOAPIC_IOREGSEL_REG], dword IOAPIC_IOREDTBL2_hi
      mov [rsi+IOAPIC_IOWIN_REG], dword (01h shl 24)  ; on LAPICID=1

      call InitLapic           

      .....
; This function will be called on each CPU:
InitLapic:
     ; LAPIC must be turned on in MSR register 1Bh, bit 11 (set to 1).
      push rax rsi
      mov rsi, [LAPICAddr]    ; Here we have current LAPIC address
      mov eax, [rsi+APIC_SPUR_REG]  ; Setup Spurious interrupt vector
      and eax, (not 01FFh)
      or  eax, (0100h or 03Fh)
      mov [rsi+APIC_SPUR_REG], eax

      mov eax, [rsi+APIC_LVT_LINT0_REG]  ; Setup LINT0
      and eax, 0FFFE58FFh
      mov [rsi+APIC_LVT_LINT0_REG], eax

      mov eax, [rsi+APIC_LVT_LINT1_REG]  ; Setup LINT1
      and eax, 0FFFE58FFh
      or  eax, 0400h
      mov [rsi+APIC_LVT_LINT1_REG], eax

      mov [rsi+APIC_TPR], dword 0h  ; TaskPriority
      mov [rsi+APIC_LVT_Timer_REG], dword 10000h  ; Shut down timer
      mov [rsi+APIC_PMC_REG], dword 10000h ; Shut down performance monitor
      mov [rsi+APIC_ERROR_REG], dword 10000h ; Shut down error interrupt
      mov eax, [rsi+20h] ; Get LAPICID
      mov [rsi+APIC_LDR_REG], dword eax ; Setup logical ID
      mov [rsi+APIC_DFR_REG], dword (0Fh shl 28) ; Setup DFR mask

      mov    al, 70h
      out    22h, al
      mov    al, 01h
      out    23h, al
      pop  rsi rax
      ret


UPD: Определения констант:
Код:

IA32_APIC_BASE equ 1Bh

LOCAL_APIC_ID_REG     = 20h

APIC_TPR              = 80h
APIC_LDR_REG          = 0D0h
APIC_DFR_REG          = 0E0h
APIC_SPUR_REG         = 0F0h
APIC_ICR_low          = 300h
APIC_ICR_hi           = 310h

APIC_LVT_Timer_REG    = 320h
APIC_PMC_REG          = 340h
APIC_LVT_LINT0_REG    = 350h
APIC_LVT_LINT1_REG    = 360h
APIC_ERROR_REG        = 370h

Initial_Count_REG     = 380h
Current_Count_REG     = 390h
Divide_Configuration_REG = 3E0h

APIC_EOI_REG          = 0B0h

;----------------------------------------------------------------

IOAPIC_IOREGSEL_REG  = 0h
IOAPIC_IOWIN_REG     = 10h

IOAPIC_EOI_REG       = 040h

IOAPIC_IOAPICID      = 0
IOAPIC_IOAPICVER     = 1h

IOAPIC_IOREDTBL0_low = 10h
IOAPIC_IOREDTBL0_hi  = 11h
IOAPIC_IOREDTBL1_low = 12h
IOAPIC_IOREDTBL1_hi  = 13h
IOAPIC_IOREDTBL2_low = 14h
IOAPIC_IOREDTBL2_hi  = 15h


Последний раз редактировалось Bargest 19 мар 2012, 21:38, всего редактировалось 3 раз(а).

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: SMP, переназначение прерываний
СообщениеДобавлено: 19 мар 2012, 21:23 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Просто. В текущей директории, откуда делаешь запуск Bochs, нужно сделать конфигурационный файл bochsrc.txt
Образец находится в файле bochsrc-sample.txt
В нём находишь параметр memory:
и прописываешь нужную цифру (в мегабайтах). Вообще-то по умолчанию там должно быть больше мегабайта.

В твоём исходнике много макросов, значение которых надо было тоже прописать.


Последний раз редактировалось Himik 19 мар 2012, 21:33, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB