ARM裸机多核内核选择

时间:2018-08-15 16:18:06

标签: multithreading arm multicore bare-metal

用于多核ARM平台,例如(4个CPU的Cortex-A53群集):
如何我们可以分配一个特定的内核以运行某些功能作为编写简单的裸调度程序的基础吗?
如何不同的主线RTOS在ARM上实现这种功能?

2 个答案:

答案 0 :(得分:1)

您正在前进,首先您需要了解芯片供应商如何管理这些内核。分为两大类,一类是芯片供应商立即在所有内核上发布重置,另一类是芯片供应商在一个内核上发布重置,然后该核心可以通过CSR在其他内核上发布重置。树莓派家族就是前者的一个例子,基于全志者的东西就是后者的一个例子。

尽管它仍然非常易于管理,但所有内核都将进入内存的同一位置,即复位异常地址,因此您可以从一开始就放置对内核排序的代码,或者在释放每个内核时更改复位处理程序将每个新内核路由到新位置。如果您在raspberry pi裸机论坛上查看,您会看到执行此操作的简单代码,并且/或者只是转储GPU引导加载程序放置在arm ram开头的代码以对内核进行排序(引导时没有config.txt,该代码停放了三个核心,然后让core0运行,然后在其中放入一些代码,以便core0可以通过uart打印出前几十个单词的内容,然后反汇编以查看它们的工作方式)。基本上每个内核都有一个唯一的ID,您可以使用该ID将内核执行路由到自己的代码。

移植的操作系统应该为您完成所有这些工作。

早期的多核非常明显,并且在技术参考手册中显示,每个核都有自己的时钟使能和重置,由芯片供应商决定如何处理这些时钟。较新的内核和文档都有这个黑匣子,因此我不知道它是如何工作的,但确实知道我们在芯片供应商中看到了两种解决方案。我发现broadcom / pi方法更好,仅是因为没有任何隐藏的/未记录的CSR可以找到或找出来,在这里所有的赢家都必须等待有人破解它才能找到答案。并不意味着所有的Broadcom或所有的赢家都是一样的,每个公司都可以自由设计每个零件,但是他们喜欢并且可能会有不同的解决方案。如果Broadcom的pi相关部件具有一个控制寄存器来控制GPU,并且如果我们能够找到它的话,我们可能会弄弄自己,我不会感到惊讶。

一旦内核开始运行,就可以简单地将特定内核的程序计数器指向特定地址。通过复位,您可以控制该内核的位置,或者通过对该内核的中断或异常来控制返回到另一个地址。与对单个核心处理器的控制没有区别。这里没有魔术。

答案 1 :(得分:0)

将一个核心分配给一个软件或将多个核心分配给一个软件不是可以更改的硬件配置。这完全取决于用例以及软件流程。让我们举个例子。

让我们采用4核的CortexA53集群。通常,在开始时,会运行初始化固件的电路板。像xilinx使用zcu102的FSBL(第一阶段引导程序)一样,它也具有4个cortexA53内核。之后运行ATF(受信任的固件),然后运行uboot。所有这些都在核心0上运行。

重要:现在,当我们使用u-boot启动任何二进制文件时,它会在core0上启动。可以说我们启动了linux。现在,在进行了几次初始化之后,Linux将使用一些Soc特定的寄存器启动其他内核。通常,两个寄存器很重要。当一个内核上的软件想要启动另一个内核时,它将把软件加载到要在core1上执行的内存中,并将使用其起始地址对一个特殊寄存器进行编程,并使用另一个特殊寄存器将其退出复位和core1将开始执行该软件。

因此,您看到的一切都取决于它是否要使用其他内核。

因此编写您的代码时,不用担心它将被其他内核自动执行,并且一切都会发生!!!

这里,为了简单起见,我在上面进行了一次更正:linux直接使用寄存器来启动其他内核。在ARM中不是这种情况。我们使用称为SMC的特殊调用。这些调用进入安全的世界,在这里,ATF会调查为SMC传递了哪些参数并提供适当的服务。

其他内容:要快速入门,请使用供应商提供的启动文件,并通过访问其序列号编写一个简单的hello world应用程序,并通过以下命令使用uboot加载该应用程序

fatload mmc 0:1 0x0 app.bin; go 0x0

它将从sd卡加载您的应用程序,并在core0的地址0x0上启动它。 显然,您必须将地址更改为应用程序链接到的地址,并且还要将地址更改为mmc之后给出的分区号。