OSDev http://osdev.su/ |
|
SMP, переназначение прерываний http://osdev.su/viewtopic.php?f=7&t=510 |
Страница 1 из 3 |
Автор: | Bargest [ 18 мар 2012, 22:54 ] |
Заголовок сообщения: | SMP, переназначение прерываний |
Только что настроил 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 исключение). ЧЯДНТ? |
Автор: | Станислав [ 19 мар 2012, 03:52 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Я сейчас читаю про апик, тоже хочется 24 прерывания и доступ к процессорам, тем более что книжка нашлась по этой теме, но я в 32битном режиме, через апик можно получить инфу о процессорах. У тебя сколько 3 процессора? АМДшка чтоли? |
Автор: | Bargest [ 19 мар 2012, 10:01 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Станислав писал(а): Я сейчас читаю про апик, тоже хочется 24 прерывания и доступ к процессорам, тем более что книжка нашлась по этой теме, но я в 32битном режиме, через апик можно получить инфу о процессорах. У тебя сколько 3 процессора? АМДшка чтоли? У меня 4 процессора (индексы 0..3), и это QEMU :). Разницы между х32 и х64 тут быть не должно, т.к. апик все-таки внешнее устройство. Локальные APIC вроде настроил, а IO никак. |
Автор: | Himik [ 19 мар 2012, 16:08 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Эта небольшая заметка может помочь https://docs.google.com/document/d/1DE5 ... Qs940/edit |
Автор: | Bargest [ 19 мар 2012, 17:57 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
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 Не помогло. |
Автор: | Himik [ 19 мар 2012, 18:41 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Попробуй запустить в Bochs. Он при ошибках сообщает много отладочной информации. Журнал ошибок смотри в файле bochsout.txt, который создаётся после каждого запуска (даже при отсутствии ошибок). Это в данном случае ни на что не влияет, но лучше исправить. У "Spurious interrupt vector" последняя цифра номера обязательно должна быть F. Кстати в IOAPIC по умолчанию (если ничего не настраивать) все прерывания замаскированы. Попробуй ничего в регистры не записывать - должна быть "тишина". Затем пробуй постепенно по одному прерыванию настраивать и смотреть реакцию. |
Автор: | Bargest [ 19 мар 2012, 19:30 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Поправил spurious. С BOCHS там затыки, в свое время от него отказался. Память он нормально не эмулирует. Так. Тишины добился. При размаскировании клавиатуры 0 эмоций, при размаскировании таймера - только Spurious прерывание. В доках пишут, что это прерывание может возникнуть если TaskPriority = Interrupt Priority. Понизил TP - пропало. Значит какие-то движения есть... Но все же самого размаскированного прерывания нет. Продолжаю эксперименты. UPD: Мапаю прерывание через IOAPIC на какой-нибудь эксепшен (любой в [0..1Fh])- он происходит. Причем вне зависимости от того, было ли само прерывание (мапаю одно любое, хоть таймер, хоть клавиатуру, хоть что-либо еще - сразу случается эксепшен, указанный как вектор). Если же мапаю на что-нибудь адекватное - ничего не происходит. UPD2: Наконец-то. Спасибо огромное, Himik. :) |
Автор: | Himik [ 19 мар 2012, 20:57 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Гуд. И всё-же попробуй новую версию Bochs 2.5.1 http://sourceforge.net/projects/bochs Ни каких проблем с памятью я что-то не замечал. |
Автор: | Bargest [ 19 мар 2012, 21:16 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
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 |
Автор: | Himik [ 19 мар 2012, 21:23 ] |
Заголовок сообщения: | Re: SMP, переназначение прерываний |
Просто. В текущей директории, откуда делаешь запуск Bochs, нужно сделать конфигурационный файл bochsrc.txt Образец находится в файле bochsrc-sample.txt В нём находишь параметр memory: и прописываешь нужную цифру (в мегабайтах). Вообще-то по умолчанию там должно быть больше мегабайта. В твоём исходнике много макросов, значение которых надо было тоже прописать. |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |