Всем привет! Я тут заинтересовался многопроцессорными системами и решил написать свой пример. Почитал Intel Manual 3A, обсуждение http://www.wasm.ru/forum/viewtopic.php?id=20454&p=1 и решил, что готов к бою. Однако АР процессора не откликаются. Помогите пожалуйста. Код (Text): ;код для АР переношу на 90000h mov esi,AP mov edi,90000h mov ecx,END_AP sub ecx,esi shr ecx,3 inc ecx rep movsq ;определяю идентификатор ядра ;в регистре с относительным адресом 20h ;лежит apic id mov esi,boot_id_msg int 30h mov esi,apic_base add esi,20h mov eax,[esi] and eax,0ff000000h mov [boot_id],eax call I2H64 mov esi,convstr int 30h add [cursor],10 ;разрешаю использование apic mov esi,apic_base add esi,0f0h mov eax,[esi] or eax,100h mov [esi],eax ;установлю пустой обработчик ошибок mov esi,apic_base add esi,370h mov eax,[esi] and eax,0ffffff00h or eax,0a0h mov [esi],eax ;устанавливаю делитель равным 1 ;(для генератора синхроимпульсов в cpu?) mov esi,apic_base add esi,3e0h mov eax,1011b mov [esi],eax ;здесь устанавливается время для таймера ;(в миллисекундах?) mov esi,apic_base add esi,380h mov dword [esi],4000000 ;настраиваю регистр времени ;отрабатывает один раз ;обработчик №161 ;=============================================== ;чтобы замаскировать прерывания приходящие от ;таймера необходимо установить бит 16 ;почему-то прерывание проходит только один раз ;поэтому в случае с периодически работающим ;таймером получать прерывания на каждом периоде ;не удаетс ;=============================================== mov esi,apic_base add esi,320h mov eax,[esi] and eax,0fffcff00h;0fffdff00h or eax, 100a1h mov [esi],eax cli ;разошлем сигнал init mov esi,apic_base add esi,300h mov eax,0c0500h mov [esi],eax ;пошлем сигнал sipi mov eax,0c0690h mov [esi],eax sti main_loop: jmp $ AP: jmp display_ap_msg ap_msg db 'I',7, ' ',7, 'a',7, 'm',7, ' ',7, 'A',7, 'P',7 ap_msg_l dw $-ap_msg display_ap_msg: mov ax, 0B800h add ax,100 mov es, ax xor di, di mov si, ap_msg mov cx, word [ap_msg_l] rep movsb jmp $ END_AP:
Вот полезная статья, которую я в своё время зазеркалил: http://download.xskernel.org/docs/processors/multiprocessing/smp.html Конечно, она не без ошибок, но всяко лучше, чем ничего. APIC инициализируешь из защищённого режима? Из реального режима до регистров APIC не добраться. Вот ветка, посвящённая APIC, в моём проекте: http://svn.xskernel.org/viewvc/xskernel-current/xskernel/include/arch/i386/io/apic/ Оттуда можно и пример подглядеть.
Большое спасибо, SadKo. Сейчас буду изучать исходники. А так я инициализирую APIC из режима 64б (long mode). Причем работаю в Bochs, т.к. тестовой системой не обзовелся. Проблема в том, что я вижу по сообщениям, что второй проц откликается, даже выполняет обращение к MSR, но не выполняет других операций, например, работы с памятью.
Думаю, надо просто собрать bochs с дебаггером и запустить в режиме трассировки. Запускать надо последовательностью INIT-SIPI-SIPI, при этом учитывать, что AP стартует всегда в реальном режиме, то есть для его старта необходимо использовать 16-разрядный код, начало которого должно быть выровнено (если не изменяет память) на границу страницы. Если используется не 16-разрядный код, то AP может просто повиснуть. Адрес стартовой точки передаётся в SIPI (а для старых процов хранится по физическому адресу 0x467).
Отлично. Теперь понял в чем дело: ведь я действительно передавал код перед которым использовал директиву use32. Наверное он действительно ставил соответствующие префиксы в опкодах. Обязательно попробую как доберусь до машинки. Спасибо.