在过去的 3-4 天里,我一直在为此苦苦思索,但找不到合适的解释性文档(来自 ARM 或非官方)来帮助我。我有一个ODROID-XU 板(big.LITTLE 2 x Cortex-A15 + 2 x Cortex-A7)板,我正在尝试更多地了解 ARM 架构。在我的“实验”代码中,我现在已经到了想要从 WFI(等待中断)状态唤醒其他内核的阶段。
我仍在尝试查找的缺失信息是:
1.获取内存映射的GIC的基地址时明白需要读取CBAR;但是没有任何文档解释应该如何安排 CBAR 中的位(2 个 PERIPHBASE 值)以到达最终的 GIC 基地址
2、通过GICD_SGIR寄存器发送SGI时,0到15之间的中断ID应该选择什么?有关系吗?
3.通过 GICD_SGIR 寄存器发送 SGI 时,如何告诉其他内核从哪里开始执行?
4.我的代码由 U-BOOT 引导加载程序加载这一事实如何影响此上下文?
Cortex-A 系列程序员指南 v3.0(可在此处找到:链接)在第 22.5.2 节(Linux 中的 SMP 启动,第271页)中陈述了以下内容:
当主核心启动时,辅助核心将使用 WFI 指令保持在待机状态。它(主内核)将向辅助内核提供启动地址并使用处理器间中断(IPI)唤醒它们,这意味着通过 GIC 发出 SGI 信号
Linux 是如何做到这一点的?文档-S没有提供有关“它将为辅助内核提供启动地址”的任何其他详细信息。
我的挫败感越来越大,我将非常感谢您的回答。非常感谢您!
额外细节
我使用的文档:
- ARMv7-A&R 架构参考手册
- Cortex-A15 TRM(技术参考手册)
- Cortex-A15 MPCore TRM
- Cortex-A 系列程序员指南 v3.0
- GICv2 架构规范
我现在所做的:
- UBOOT 在 0x40008000 加载我;我已经设置了转换表 (TTB),相应地编写了 TTBR0 和 TTBCR,并将 0x40008000 映射到 0x8000_0000 (2GB),所以我还启用了 MMU
- 设置我自己的异常处理程序
- 我通过串口获得了 Printf 功能(ODROID-XU 上的 UART2)
以上所有似乎都可以正常工作。
我现在正在尝试做的事情:
- 获取 GIC 基地址 => 在我读取 CBAR 的那一刻,我只需将其值与 0xFFFF8000 与(&)它的值并将其用作 GIC 基地址,尽管我几乎可以肯定这不正确
- 通过写入值为 0x1 的 GICD_CTLR 来启用 GIC 分发器(从 GIC 基地址偏移 0x1000 处?)
- 使用以下参数构造一个 SGI:Group = 0, ID = 0, TargetListFilter = "All CPUs except Me" 并通过 GICD_SGIR GIC 寄存器发送(写入)
- 由于我没有传递其他内核的任何执行起始地址,所以在这一切之后什么都没有发生
....更新....
我已经开始查看 Linux 内核和 QEMU 源代码以寻找答案。这是我发现的(如果我错了,请纠正我):
- 当给电路板加电时,所有内核都从复位向量开始执行
- 软件(固件)组件在辅助核心上执行 WFI 和一些其他代码,这些代码将充当这些辅助核心和主核心之间的协议,当后者想要再次唤醒它们时
- 例如,EnergyCore ECX-1000 (Highbank)板上使用的协议如下:
**(1)** the secondary cores enter WFI and when
**(2)** the primary core sends an SGI to wake them up
**(3)** they check if the value at address (0x40 + 0x10 * coreid) is non-null;
**(4)** if it is non-null, they use it as an address to jump to (execute a BX)
**(5)** otherwise, they re-enter standby state, by re-executing WFI
**(6)** So, if I had an EnergyCore ECX-1000 board, I should write (0x40 + 0x10 * coreid) with the address I want each of the cores to jump to and send an SGI
问题:
- 1. 执行此操作的软件组件是什么?是我写在 SD 卡上的 BL1 二进制文件,还是 U-BOOT?
- 2. 据我了解,此软件协议因板而异。是这样,还是仅取决于底层处理器?
- 3. 我在哪里可以找到有关pick-one ARM 板的此协议的信息?- 我可以在 ARM 官方网站或开发板网页上找到它吗?