【发布时间】:2013-12-02 01:45:53
【问题描述】:
在过去的 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(可在此处找到:link)在 第 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 官方网站或开发板网页上找到它吗?
【问题讨论】:
-
我相信这种初始化序列(即从待机中唤醒次级内核)是由芯片制造商(即TI,三星,... )。例如,这是在 TI OMAP 中完成的。 omappedia.org/wiki/Bootloader_Project
-
我相信(显然)它必须是以下之一:ROM 代码、BL1 代码 => 两者都无法访问(BL1 已加密 [签名]),或者引导加载程序...我已经搜索了一下引导加载程序源,但我没有找到与此 SMP 协议的任何关系;另外,Linux 似乎并不依赖引导加载程序的参数来发现协议(可能通过 ATAG),这让我相信我正在寻找的内容要么在 ROM 代码中,要么在 BL1 代码中。 .问题是哪个,因为它们无法直接访问,我在哪里可以找到关于它们为我的董事会做了什么的详细信息(ODROID-XU)......
-
我想你的意思是“即让辅助核心处于待机状态”
-
这种细节可以由某种制造商的 SoC 技术数据表提供。这就是为什么我会首先尝试查看三星资源,特别是 Exynos 5。我无法足够快地找到合适的表,所以我提供了一个类似 OMAP 芯片的链接,只是为了让您了解 TI 如何处理这些事情。
-
哦,相信我,我也试过了;我在那里打印的文档列表不完整:我也有 Exynos Dual 5 用户手册,搜索了其他相关的三星文档……但不幸的是,我在他们的文档中也找不到所需的信息;一切都是一团糟……所以我希望其他已经做过这件事的人能帮助我,也许有人知道 ARM 架构上 linux 内核的内在特性……不幸的是,这就是互联网告诉我的 @987654323 @
标签: arm multiprocessing wakeup cpu-cores cortex-a