【问题标题】:How to start additional cores on the Raspberry Pi 2 under bare-metal?如何在裸机下在 Raspberry Pi 2 上启动附加内核?
【发布时间】:2015-04-21 00:20:37
【问题描述】:

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

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

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

那么有没有其他人对此进行过调查并弄清楚内核在启动和重置时处于什么状态?使用什么引导协议/机制来启动其他内核?我发现的一个信息是这是相当特定于 SOC 的,所以请不要举例说明如何在 Cortex-A9 或其他不是 RPi 2 的东西上执行此操作。

【问题讨论】:

    标签: bare-metal smp raspberry-pi2


    【解决方案1】:

    在 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;
    }
    

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

    【讨论】:

    • 哪个文档描述了寄存器0x4000008C的用法?
    • 我的口碑
    • 我仍在尝试这个没有运气。无论我向这些邮箱写什么,似乎所有内核最终都会停止在 0x1c。使用 openocd + gdb。
    猜你喜欢
    • 2020-04-22
    • 2021-05-17
    • 2015-08-19
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 2020-03-21
    相关资源
    最近更新 更多