Как запустить дополнительные ядра на Raspberry Pi 2 под голое железо?
Вопрос довольно широкий, но я даже не смог найти отправную точку в ARMv7 ARM, MPCore TRM, руководстве по архитектуре GIC, ... Поэтому, пожалуйста, извините за неопределенность.
У меня есть простое железное ядро для Raspberry Pi 2, которое инициализирует индикатор активности, UART0, MMU и кэши, и все работает. Я могу моргать, я могу выводить текст, я могу сопоставить физические страницы с виртуальными адресами и получить к ним доступ. Все идет нормально.
Теперь я хочу запустить дополнительные ядра, и там я столкнулся с вакуумом. Пока нет примеров того, как сделать это, если не считать ядра linux, которое довольно сложно, потому что оно поддерживает так много плат. И, глядя на спецификации, я не могу найти хорошую отправную точку. Так что вместо того, чтобы постукивать в темноте, я пришел сюда.:)
Так кто-нибудь еще изучил это и выяснил, в каком состоянии находятся ядра при загрузке и перезагрузке? Какой протокол / механизм загрузки используется для запуска дополнительных ядер? Одна информация, которую я обнаружил, заключается в том, что это скорее SOC-специфический пример, поэтому, пожалуйста, не приводите примеров, как это сделать на Cortex-A9 или на чем-то еще, что не является RPi 2.
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;
}
Нужно оставить кэши отключенными на всех ядрах или включить их на всех ядрах. Отслеживание кэша работает только при включенном кэше, поэтому любое сочетание включенных / отключенных кэшей будет иметь несоответствия.