Я пишу какое-то встроенное программное обеспечение на «голом железе» для многоядерной системы. Я инициализирую поток 0 ядра 0 в качестве главного ядра и пытаюсь выполнить код на других ядрах / потоках. У меня вопрос: как мне выполнить код в определенном ядре / потоке без ОС, такой как Linux, чтобы установить привязку? Есть ли общий способ узнать, как это сделать, или это зависит от процессора? Процессор - NXP T2080 с 4 ядрами, каждое с 2 потоками.
Запустить код на конкретном ядре / потоке?
Ответы (1)
Поскольку здесь вы не используете какую-либо ОС, управление всем выполнением, в том числе и в других потоках, полностью зависит от вашего кода. То, как вы этим управляете, будет зависеть от вашего собственного кода, но здесь задействовано несколько аппаратных взаимодействий:
При инициализации системы вам нужно выбрать основной поток. Похоже, вы уже это сделали, но не уточняете, как это сделать.
На машинах ppc каждый поток имеет уникальное значение для своего регистра идентификации процессора (PIR). Если вы знаете значения PIR, вы можете просто проверить PIR, чтобы узнать, какой из них является основным. Если вы не знаете значения PIR, вы можете использовать атмоичный набор и тест, чтобы выбрать свой основной: первый поток, увеличивающий значение, становится основным, другие - второстепенными.
В зависимости от того, как вы реализовали (1), другие потоки должны будут делать что-то еще. Они простаивают? или крутится в петле?
Если они простаивают, вам необходимо вывести их из режима ожидания (после чего они войдут в вектор сброса). После того, как они выполнят код в векторе сброса, вам необходимо убедиться, что они не делают то же самое, что и основной, поэтому есть способ отправить их в свой собственный вторичный код.
Если они вращаются в цикле, то основной задачей будет вывести их из этого цикла (скажем, установив флаг, который они читают) и выполнив полезный код.
Поскольку вы упомянули, что используете C, этим вторичным компонентам, вероятно, понадобится свой собственный стек. Вам нужно будет соответствующим образом инициализировать их среду выполнения C для каждого потока, используя их собственный указатель стека в
r1
.Определение этого «полезного кода» зависит от вас, и способ, которым вы заставляете эти процессоры запускать этот код, является вашим собственным дизайном.
Простым методом было бы иметь центральный список задач, в котором первичный ставит задачи в очередь, а каждый вторичный удаляет задачу из этого списка (конечно, с соответствующей блокировкой) и выполняет ее.
Поскольку вы хотите контролировать сходство, ваше решение будет немного сложнее (скажем, очереди для каждого потока), но оно не должно существенно отличаться.
Посмотрите, как мы это делаем в skiboot (прошивка для 64-битных машин POWER), если вам нужен пример: https://github.com/open-power/skiboot/blob/master/asm/head.S#L305.