运行 具体 core/thread 的代码?

Run code on specific core/thread?

我正在多核系统上编写一些裸机嵌入式软件。我正在将核心 0 线程 0 初始化为主核心,并尝试在其他核心上执行代码 cores/threads。我的问题是如何在没有 OS 的特定 core/thread 上执行代码,例如 Linux 来设置亲和力?有没有一种通用的方法可以知道如何做到这一点,或者它是特定于处理器的?处理器是 NXP T2080,有 4 个内核,每个内核有 2 个线程。

由于您在这里没有使用任何 OS,因此完全由您的代码来管理所有执行,包括在其他线程上的执行。您管理的方式主要取决于您自己的代码,但涉及一些硬件交互:

  1. 在系统初始化时,您需要选择一个主线程。听起来你已经这样做了,但你没有说明如何做。

    在 ppc 机器上,每个线程都有一个唯一的处理器标识寄存器 (PIR) 值。如果您知道 PIR 的值,那么您只需检查 PIR 即可确定哪个是主要的。如果您不知道 PIR 值,那么您可以使用 atmoic 设置和测试来选择您的主要线程:第一个增加值的线程成为主要线程,其他线程是次要线程。

  2. 根据您实现 (1) 的方式,其他线程将需要做其他事情。他们闲着吗?还是循环旋转?

    如果它们处于空闲状态,则您需要让它们退出空闲状态(之后它们将进入重置向量)。一旦他们执行重置向量中的代码,您需要确保他们不会做与主要代码相同的事情,因此有一些方法可以将他们发送到他们自己的次要特定代码。

    如果它们在一个循环中旋转,则由主节点将它们从该循环中取出(例如,通过设置一个它们读取的标志)并执行有用的代码。

    既然您已经提到您使用的是 C,那么这些辅助工具可能需要它们自己的堆栈。您需要使用 r1.

  3. 中他们自己的堆栈指针适当地初始化他们的每线程 C 运行时
  4. "useful code" 的定义由您决定,您获取这些处理器的方式 运行 该代码是您自己的设计。

    一个简单的方法是拥有一个中央任务列表,其中主要任务将任务排入队列,每个辅助任务从该列表中取出一个任务(当然需要适当的锁定)并执行它。

    因为你想控制亲和力,你的解决方案会稍微复杂一点(比如,每线程队列),但它不需要有很大的不同。

看看我们如何在 skiboot(64 位 POWER 机器的固件)中执行此操作,如果您想要一个示例:https://github.com/open-power/skiboot/blob/master/asm/head.S#L305