问题相当广泛但我甚至无法在ARMv7 ARM,MPCore TRM,GIC架构手册中找到起点......所以请原谅模糊性。
我有一个简单的裸机内核用于Raspberry Pi 2初始化活动LED,UART0,MMU和缓存,一切正常。我可以眨眼,我可以输出文本,我可以将物理页面映射到虚拟地址并访问它们。到目前为止一切都很好。
现在我想启动额外的内核,在那里我遇到了真空。目前还没有关于如何做到这一点的Linux内核的例子,因为它支持如此多的主板,因此相当复杂。看看规格我似乎找不到任何好的起点。因此,我没有在黑暗中徘徊,而是来到这里。 :)
所有其他人都在研究这个并找出核心在启动和重置时的状态?什么启动协议/机制用于启动aditional核心?我发现的一个信息是这是特定于SOC的,所以请不要在Cortex-A9或其他不是RPi 2的情况下做一些示例。
答案 0 :(得分:7)
在RPi 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;
}
应该在所有核心上禁用缓存或在所有核心上启用它们。缓存侦听仅适用于缓存启用,因此任何启用/禁用缓存的混合都将具有不一致性。