我正在多核系统上编写一些裸机嵌入式软件。我正在初始化核心0线程0作为主核心,并尝试现在在其他核心/线程上执行代码。我的问题是如何在没有Linux等操作系统的情况下在特定的核心/线程上执行代码来设置亲和力?有没有通用的方法来知道如何做到这一点,还是特定于处理器?处理器是恩智浦T2080,有4个内核,每个内核有2个线程。
答案 0 :(得分:1)
由于您未在此处使用任何操作系统,因此完全取决于您的代码来管理所有执行,包括其他线程上的执行。您管理的方式主要取决于您自己的代码,但涉及一些硬件交互:
在系统初始化时,您需要选择一个主线程。听起来你已经这样做了,但你没有说明如何。
在ppc机器上,每个线程的处理器识别寄存器(PIR)都有唯一的值。如果您知道 PIR的值,那么您只需检查PIR以查看哪个是主要的。如果您不知道PIR值,那么您可以使用atmoic set-and-test来选择您的主要:第一个增加值的线程变为主要,其他线程为次要。
根据您的实现方式(1),其他线程需要做其他事情。他们闲着吗?或者在一个循环中旋转?
如果它们处于空闲状态,则需要将它们置于空闲状态(之后它们将进入复位向量)。一旦他们在重置向量中执行代码,您将需要确保它们不会与主要代码执行相同的操作,因此可以通过某种方式将它们发送到自己的特定于次要代码。
如果他们在一个循环中旋转,那么将由主要人员将他们从该循环中取出(例如,通过设置他们读取的标志)并执行有用的代码。
既然你已经提到过你正在使用C语言,那些辅助语句可能需要自己的堆栈。您需要在r1
中使用自己的堆栈指针适当地初始化每个线程的C运行时。
“有用代码”的定义取决于您,以及您运行该代码的那些处理程序的方式是您自己的设计。
一个简单的方法是拥有一个中心任务列表,其中主要任务排队,每个次要任务从该列表中取出任务(当然有适当的锁定)并执行它。
由于你想控制亲和力,你的解决方案会稍微复杂一些(比如每个线程的队列),但它不需要有太大的不同。
如果您想要一个示例,请查看我们如何在skiboot(64位POWER机器的固件)中执行此操作:https://github.com/open-power/skiboot/blob/master/asm/head.S#L305。