При инициализации своих объектов задачи ставлю их в кольцо задач, и процессор BSP вместо простого зацикливания ставлю на постоянное хождение по кольцу задач и проверку бита на активацию по этому биту.
Основная активация конечно по прерываниям, но эта активация тоже очень пригодиться.
У объекта задача есть страница для каталога страниц и страница для стека процессора, плюс данные о уровне защиты и много чего ещё.
Вообще ядро буду делать как модуль для работы с объектами, т.к. главное в моей системе это стабильная работа задач, и настройка объектов (устройств, модулей, протоколов, форматов, ...).
Часть кода для настройки процессоров выглядит так:
Код:
;Синхронизация
@@: bt dword[SEMAPHORE],0
jnc @b ;ожидание сброса бита занятости
lock btr dword[SEMAPHORE],0 ;установка бита занятость для изменения общих регистров
jnc @b
inc byte[sys_080]
mov esp,0
lock bts dword[SEMAPHORE],0 ;снятие бита занятости
mov ecx,1Bh ;включим APIC
rdmsr
bts eax,11
wrmsr
mov eax,[0FEE00000h+20h]
shr eax,24 ;номер lapic
movzx edx,byte[sys_080] ;номер cpu
dec edx
mov ebp,cpusss+4096
shl edx,8
add ebp,edx
movzx edx,byte[sys_080] ;номер cpu
здесь объекты забиваю для процессора
mov ecx, 1Bh
rdmsr
bt eax, 8 ;Если процессор не BSP (bootstrap processor) то АР (application processor) и мы выходим.
jc @f
sti
.0:
hlt
jmp .0
@@:
mov esp,cpusss+4096
call init_cpu ;сообщение процессорам для пробуждения
здесь код
jmp в кольцо задач
Процессор BSP уходит на кольцо задач, а процессоры АР в hlt и ждут задания, причём они не имеют своего стека, а получают стек от задачи.
Для себя поставил цель сделать так, чтобы процессоры AP решали все проблемы задачи, и при активации задачи ей даётся свободный процессор или сам BSP идёт её выполнять.
Ещё будет работа нескольких процессоров над одной задачей (без стека)
Как известно процессоры быстрее не станут, а их количество будет расти.
Подробности писать не буду, если есть что добавить к алгоритму пишите, буду рад.