Раньше был вопрос как заставить выполниться код на другом процессоре, с IPI и APIC вроде бы разобрался. Но после недолгих раздумий возник другой глупый вопрос. Допустим в системе два процессора, наша программа выполнялась на первом процессоре, перевела его в защищённый режим (или 64-битный режим), а как быть с другим процессором, ведь он то ещё в реальном режиме и у него в регистрах IDTR, GDTR, CR0 совсем другие данные?
Первый процессор (ведущий) должен запустить остальные процессоры, причём они должны начать свою работу с программы, переводящей их в защищённый режим. Когда все они перейдут, они каким-то образом должны об этом сообщить ведущему (например, путём установки соответствующего бита в заранее известной ячейке памяти). И только после этого система может переходить к нормальной работе.
rpy3uH как уже описал SII нужно переводить каждый процессор по отдельности. Описанно это в MultiProcessor Specification. Хотя порывшись в исходниках биоса, был удивлен что он много чего там настраивает. Так-что все сводиться чутьли не к посылки IPI. Вообщем дальше я пока нестал разбираться.
но всё равно я склоняюсь к варианту, чтобы сначала перевести все процессоры в зашищённый режим (или Long mode)
вроде всё понятно, осталось только кодить. но всё же есть один вопрос 7.5.4.1 Typical BSP Initialization Sequence (интеловский мануал) это обязательно? насколько я понял, это обязательно может есть какие-нибудь исходники-примеры инициализации нескольких процессоров?
rpy3uH Этим занимается BIOS. Я думаю надо смотреть исходники линукса и искать правду. Насколько я знаю там все просто. Тебе просто надо подготовить код, послать SIPI или IPI на APIC нужного процессора и он начнет выполнять твой код. В этом коде нужно перевести оставшиеся процесоры в защищенный режим.