Multithreading ARM裸金属多芯磁芯选择

Multithreading ARM裸金属多芯磁芯选择,multithreading,arm,multicore,bare-metal,Multithreading,Arm,Multicore,Bare Metal,对于多核ARM平台,例如(由4个CPU组成的Cortex-A53群集): 我们如何分配一个特定的内核来运行一些函数,作为编写简单的裸调度程序的基础 不同的主线RTO是如何在ARM上实现这些功能的?您正在向前迈进,首先您需要了解芯片供应商是如何管理这些核心的。分为两大类,一类是芯片供应商立即在所有内核上释放重置,另一类是芯片供应商在一个内核上释放重置,然后该内核可以通过CSR在其他内核上释放重置。树莓皮家族是前者的一个例子,基于allwinner的东西是后者的一个例子 尽管如此,它仍然非常易于管理

对于多核ARM平台,例如(由4个CPU组成的Cortex-A53群集):
我们如何分配一个特定的内核来运行一些函数,作为编写简单的裸调度程序的基础

不同的主线RTO是如何在ARM上实现这些功能的?

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

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

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

早期的多核非常明显,在技术参考手册中显示,每个核都有自己的时钟启用和重置,由芯片供应商决定如何处理这些。较新的核和文档有这个黑匣子,所以我不知道它是如何工作的,但我知道我们在芯片供应商中看到了这两种解决方案。我发现broadcom/pi方法更好,只是因为没有隐藏的/未记录的CSR需要查找或找出,allwinner在哪里你必须等待有人破解才能找到。这并不意味着所有broadcom和allwinner都是一样的,每个公司都可以自由地设计每个单独的部件,不管他们喜欢什么,而且很可能都有di不同的解决方案。如果broadcom的pi相关部件有一个GPU可以处理的控制寄存器,并且如果我们能够找到它,我们可能可以处理自己,我不会感到惊讶


一旦核心运行,那么只需简单地将特定核心的程序计数器指向特定地址即可。通过重置控制核心的位置,或者通过中断或异常控制该核心,然后将控制权返回到不同的地址。这与控制单个核心处理器没有区别这里没有什么神奇之处。

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

让我们以4核CortexA53群集为例。通常在启动板初始化固件时运行。与xilinx的zcu102中的FSBL(第一阶段引导加载程序)一样,它也有4个CortexA53核。之后运行ATF(arm受信任固件),之后运行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卡加载您的应用程序,并在地址0x0的core0上启动它。
显然,您必须将地址更改为应用程序链接的地址,以及mmc后给出的分区号。

感谢您的回复
如果您能详细阐述最后一段内容,那将非常感谢。这一点正是我所关心的。我想我已经讲过了,您如何引导/切换单个内核从一个线程到另一个线程其他?这有什么不同?不同之处在于,您可能(或可能不取决于您的设计)必须读取寄存器,以确定哪个线程正在运行该代码,以确定要将其切换到哪个线程。这里没有什么神奇之处,所有的核都看到相同的内存空间,因此它们都(可以)请参阅相同的代码。与其简单地将一个核心从一个线程切换到下一个优先级顺序的线程,您可以让多个线程运行,每个核心可能有也可能没有自己的下一个线程。或者,您可以让下一个核心以优先级顺序运行。请理解,与单个核心不同se内核确实是并行运行的,因此任何需要它们以单个文件顺序通过的数据结构或路径都需要一些通常不需要处理的工作