Процедура ARMv8 (aarch64, RPi4) для загрузки дополнительных процессоров

Из https://github.com/s-matyukevich/raspberry-pi-os/blob/master/docs/lesson01/rpi-os.md Я нашел такое утверждение:

The Raspberry Pi 3 has four core processors, and after the device is powered on, each core begins to
execute the same code.

Это означает, что как только контроль над ядром перейдет, все 4 ядра начнут его выполнять, как если бы они были основными процессорами, правильно ли это?

Мне интересно Загрузка вторичных ядер ARM Cortex-A с Linux, но я понятия не имею, о каком boot_reg они говорят

Знаете ли вы какую-либо документацию, в которой документирована процедура загрузки основных/вторичных процессоров для ARMv8 (aarch64) в целом и особенно для RPi4 (BCM2711)? Заранее спасибо!

Как загрузить дополнительные процессоры в процессоре Cortex-A72?

P.S.: Те, кто хочет закрыть вопрос, не хотите ли указать причину в комментариях, чтобы я мог изменить вопрос и добавить больше деталей, если вам нужно?

SO предназначен исключительно для вопросов, связанных с программированием (кодом) или использованием инструментов программиста (IDE, компилятор и т. д.). Ваш вопрос не касается ни одной из этих вещей, поэтому здесь он не по теме. Вместо этого вы, вероятно, захотите Raspberry Pi.

Ken White 06.08.2024 00:33

@KenWhite: Этот вопрос косвенно касается того, как писать код, а именно, загрузочный код для конкретного устройства. Программирование низкого уровня находится в теме.

Nate Eldredge 06.08.2024 18:04

@NateEldredge: Нет, это не так. Это был запрос документации, которая является сторонним ресурсом, и в вопросе вообще не было ничего конкретного по написанию кода.

Ken White 06.08.2024 18:15
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все верно, все ядра начинают выполнять один и тот же код. Поскольку обычно вы хотите, чтобы они в конечном итоге делали разные вещи, вы должны написать этот общий код так, чтобы он заставлял ядро ​​получать свой собственный идентификационный номер (из системного регистра mpidr_el1) и делать все, что подходит для этого ядра.

Код, который вы связали, представляет собой простой игрушечный пример, в котором только ядро ​​№ 0 продолжает делать что-то интересное (печатать приветственное сообщение). Остальные переходят к proc_hang, который представляет собой бесконечный цикл, поэтому они никогда не делают ничего, кроме траты электроэнергии. С этого момента мы можем просто игнорировать их, как будто их вообще не существует.

В настоящей многопроцессорной операционной системе хотелось бы, чтобы другие ядра в конечном итоге сделали что-то полезное. Обычно у вас есть ядро ​​№ 0, которое выполняет необходимую инициализацию и отправляет остальные в цикл, где они ждут (желательно в состоянии с низким энергопотреблением), чтобы получить уведомление о пробуждении от ядра № 0. Механизмы межпроцессорной связи для этого существуют вне самих ядер ЦП, как часть периферийного оборудования SoC или платформы платы, поэтому вы не найдете их обсуждения в документации Cortex A-72.

boot_reg, обсуждаемый в Загрузка вторичных ядер ARM Cortex-A с Linux , характерен для платформы под названием Versatile Express. Его нет на чипах Broadcom, используемых Raspberry Pi (например, BCM2711 для Pi 4), но у них есть аналогичная функция, называемая «почтовые ящики», которая позволяет одному ядру вызывать прерывание на другом ядре. Дополнительную информацию см. в главе 13 спецификации BCM2711.

спасибо большое за объяснение! That's correct, all cores start executing the same code, есть ли какой-нибудь документ ARM, в котором это говорится, или это своего рода эмпирическое правило?

k1r1t0 06.08.2024 09:49

Это не будет документ ARM, поскольку процесс загрузки настраивается SoC, а не ядром. Способ загрузки аппаратного обеспечения BCM2711 будет описан в документе Broadcom, но здесь мы говорим о том, как вы получаете управление от загрузчика — это специальное программное обеспечение RPi, поэтому вам следует обратиться к документации Raspberry Pi.

Nate Eldredge 06.08.2024 18:07

Другие вопросы по теме