Запустить код на конкретном ядре / потоке?

Я пишу какое-то встроенное программное обеспечение на «голом железе» для многоядерной системы. Я инициализирую поток 0 ядра 0 в качестве главного ядра и пытаюсь выполнить код на других ядрах / потоках. У меня вопрос: как мне выполнить код в определенном ядре / потоке без ОС, такой как Linux, чтобы установить привязку? Есть ли общий способ узнать, как это сделать, или это зависит от процессора? Процессор - NXP T2080 с 4 ядрами, каждое с 2 потоками.


person Tall_Programer    schedule 03.02.2018    source источник
comment
Да, это зависит от процессора   -  person Sami Kuhmonen    schedule 03.02.2018
comment
@SamiKuhmonen Хорошо, я подумал. Любой опыт делать что-то подобное. Я просто не знаю, с чего начать. Лучший подход, который я могу придумать, - это переместить указатель инструкции потоков на код, который я хочу выполнить, но я не уверен.   -  person Tall_Programer    schedule 03.02.2018
comment
К сожалению, я не делал этого сам, работал только на этом низком уровне на одноядерных системах. Но предположил бы, что это способ сделать это. У обработчика должна быть таблица данных, чтобы объяснить, что необходимо   -  person Sami Kuhmonen    schedule 03.02.2018
comment
@SamiKuhmonen Хорошо, спасибо за совет!   -  person Tall_Programer    schedule 03.02.2018
comment
Вы делаете это с отсутствием базового уровня абстракции оборудования или ОС?   -  person Jeremy Kerr    schedule 05.02.2018
comment
У каждого ядра будет свой ПК, начальный адрес, SP и так далее. На самом деле это не отличается от наличия x разных одноядерных CPU: s, за исключением того, что они могут обращаться к одной и той же памяти. Хотя я не знаю конкретной части.   -  person Lundin    schedule 05.02.2018
comment
@JeremyKerr Никакой абстракции. Я настраиваю регистры и управляю оборудованием с помощью комбинации C и некоторой сборки.   -  person Tall_Programer    schedule 05.02.2018


Ответы (1)


Поскольку здесь вы не используете какую-либо ОС, управление всем выполнением, в том числе и в других потоках, полностью зависит от вашего кода. То, как вы этим управляете, будет зависеть от вашего собственного кода, но здесь задействовано несколько аппаратных взаимодействий:

  1. При инициализации системы вам нужно выбрать основной поток. Похоже, вы уже это сделали, но не уточняете, как это сделать.

    На машинах ppc каждый поток имеет уникальное значение для своего регистра идентификации процессора (PIR). Если вы знаете значения PIR, вы можете просто проверить PIR, чтобы узнать, какой из них является основным. Если вы не знаете значения PIR, вы можете использовать атмоичный набор и тест, чтобы выбрать свой основной: первый поток, увеличивающий значение, становится основным, другие - второстепенными.

  2. В зависимости от того, как вы реализовали (1), другие потоки должны будут делать что-то еще. Они простаивают? или крутится в петле?

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

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

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

  3. Определение этого «полезного кода» зависит от вас, и способ, которым вы заставляете эти процессоры запускать этот код, является вашим собственным дизайном.

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

    Поскольку вы хотите контролировать сходство, ваше решение будет немного сложнее (скажем, очереди для каждого потока), но оно не должно существенно отличаться.

Посмотрите, как мы это делаем в skiboot (прошивка для 64-битных машин POWER), если вам нужен пример: https://github.com/open-power/skiboot/blob/master/asm/head.S#L305.

person Jeremy Kerr    schedule 06.02.2018
comment
Спасибо за всю полезную информацию. Я начну изучать исходный код, чтобы понять, как это реализовать! - person Tall_Programer; 07.02.2018