bare-metal - 树莓派2如何在裸机下启动额外的内核?

标签 bare-metal smp raspberry-pi2

这个问题相当广泛,但我什至无法在 ARMv7 ARM、MPCore TRM、GIC 架构手册中找到起点,...所以请原谅我的含糊不清。

我有一个用于 Raspberry Pi 2 的简单裸机内核,用于初始化事件 LED、UART0、MMU 和缓存,一切正常。我可以眨眼,我可以输出文本,我可以将物理页面映射到虚拟地址并访问它们。到目前为止一切顺利。

现在我想启动额外的核心,但我遇到了真空。目前还没有关于如何在 linux 内核之外执行此操作的示例,这相当复杂,因为它支持如此多的板。查看规范,我似乎找不到任何好的起点。所以我没有在黑暗中四处走动,而是来到了这里。 :)

那么有没有其他人研究过这个并弄清楚核心在启动和重置时的状态?什么引导协议(protocol)/机制用于启动附加内核?我发现的一个信息是,这是特定于 SOC 的,所以请不要举例说明如何在 Cortex-A9 或其他非 RPi 2 上执行此操作。

最佳答案

在树莓派 2 上,所有内核都在开机时由固件启动,然后等待将起始地址写入邮箱。发生这种情况时,它们会跳转到刚刚写入的地址。所以启动额外的内核非常容易:

// wakeup stub in asm (sets up stack and calls core_main())
extern void core_wakeup(void);
typedef void (*fn)(void);
void wakeup(int num) {
    *(volatile fn *)(0x4000008C + 0x10 * num) = core_wakeup;
}

应该在所有内核上禁用缓存或在所有内核上启用它们。缓存监听仅适用于缓存启用,因此启用/禁用缓存的任何组合都会出现不一致。

关于bare-metal - 树莓派2如何在裸机下启动额外的内核?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28610045/

相关文章:

c++ - C环境初始化裸机ARM GCC

embedded - USB 协议(protocol)中的数据切换是否特定于端点?

windows - Windows 上的引脚处理器 CPU 隔离

multithreading - 多核系统 UMA NUMA 的进程地址空间

c# - Windows 10 IoT Core - 视频打开关闭

assembly - 这个 8051 ASM 函数是否像我想象的那样不必要地复杂,或者我遗漏了什么?

c - 使用计数信号量如何创建递归互斥量

x86 - 原子操作是如何在硬件层面实现的?

C:用线程来代替这个?

c# - Windows 设备门户中的 ETW 消息为空