Я бил головой об этом в течение последних 3-4 дней, и я не могу найти объяснительную документацию DECENT (из ARM или неофициальную), чтобы помочь мне. У меня есть Плата ODROID-XU (большая. LITTLE 2 x Cortex-A15 + 2 x Cortex-A7) и я пытаюсь понять немного больше об архитектуре ARM. В моем «экспериментирующем» кодексе я сейчас пришел на сцену, где хочу ВЗГЛЯДАТЬ ДРУГИЕ КОРЫ ИЗ ИХ WFI (ожидание для прерывания).ARM: запуск/пробуждение/вывод других процессоров/точек доступа и запуск начального адреса запуска?
недостающее информация, которую я до сих пор пытаюсь найти это:
1. При получении базового адреса памяти, отображенные ГИК Я понимаю, что мне нужно прочитать сантибар; Но ни одна часть документации не объясняет, как биты в сантибар (в 2 значения PERIPHBASE) должны быть организованы, чтобы добраться до конечного базового адреса GIC
2. При отправке SGI через регистр GICD_SGIR, какое прерывание ID между 0 и 15 я должен выбрать? Это имеет значение?
3. При отправке SGI через регистр GICD_SGIR, как я могу сказать, другие ядра ЧЕГО НАЧАТЬ ИСПОЛНЕНИЕ ИЗ?
4. Как тот факт, что мой код загружается U-BOOT загрузчиком влияет на этот контекст?
Cortex-A Руководство по программированию серии v3.0 (здесь: link) утверждает следующее в разделе 22.5.2 (загрузки SMP в Linux, стр):
В то время как основное ядро загружается, вторичные сердечники будут находиться в режиме ожидания, используя команду WFI . Он (первичный сердечник) обеспечит адрес запуска для вторичных ядер и разбудить их, используя Inter-Processor Interrupt (IPI), означающей SGI средствами сигнализации через ГИК
Как Linux сделать это? Документация-S не дает никаких других сведений, относящихся к «Он предоставит начальный адрес для вторичных сердечников».
Мое расстройство растет, и я был бы очень благодарен за ответы. Большое вам спасибо!
дополнительные детали
документация Я использую:
- ARMv7-A & R Архитектура Справочное руководство
- Cortex-А15 ТРМ (Техническое справочное руководство)
- Cortex-A15 MPCore TRM
- Cortex-A Руководство по программированию серии v3.0
- GICv2 Спецификация архитектуры
Что я сделал сейчас:
- UBoot грузы со мной в 0x40008000; Я настроил вверх Таблицы перевода (БВУ), написанная TTBR0 и TTBCR соответственно и сопоставляются 0x40008000 до 0x8000_0000 (2 Гб), так что я также позволил MMU
- Set-обработчики исключений из моих собственных
- У меня есть функция Printf по сравнению с последовательным (UART2 на ODROID-XU)
Все вышеперечисленное работает нормально.
То, что я пытаюсь сделать сейчас:
- Получить базовый адрес ГИК => в данный момент я прочитал сантибар и я просто и (&) его значение с 0xFFFF8000 и использовать это в качестве ГИК базовый адрес, хотя я почти уверен, что это не так
- Включить распределитель ГИК (по смещению 0x1000 от GIC базового адреса?), по сочинительство GICD_CTLR со значением 0x1
- Построить SGI ш с следующими параметрами: Group = 0, ID = 0, TargetListFilter = «Все процессоры за исключением меня» и отправить его (записать) через регистр GICD_SGIR GIC
- Поскольку я не передал начальный адрес запуска для другого ядра, ничего не происходит после того, как все это
.... UPDATE ....
Я начал смотреть на ядре Linux и исходные коды QEMU в поисках ответа.Вот что я узнал (пожалуйста, поправьте меня, если я ошибаюсь):
- При включении питания платы всех сердечников начать работу с вектора сброса
- программного обеспечения (прошивки) компоненты выполняет WFI на вторичных ядрах и некоторый другой код, который будет действовать как протокол между этими вторичными ядрами и основным ядром, когда последний хочет их снова разбудить
- Например, протокол, используемый для EnergyCore ECX -100 0 (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. Что такое программный компонент, который делает это? Является ли это бинарным BL1, который я написал на SD-карте, или это U-BOOT?
- 2. Из того, что я понимаю, этот программный протокол отличается от платы. Это так, или это зависит только от основного процессора?
- 3. Где я могу найти информацию об этом протоколе для одной платы ARM? - Могу ли я найти его на официальном сайте ARM или на веб-странице форума?
Я считаю, что такая последовательность инициализации (то есть пробуждение вторичных ядер в режиме ожидания) выполняется с помощью кода ПЗУ, который предварительно загружен производителем чипа (т. Е. TI, Samsung, ...). Например, так это делается в TI OMAP. http://omappedia.org/wiki/Bootloader_Project – Adi
Я считаю (очевидно), что он должен быть одним из: ROM-кода, BL1 code => как недоступным (BL1 зашифрован [подписан]), либо загрузчиком ... Я искал бит через источники загрузчика, но я не нашел никакого отношения к этому протоколу SMP; Кроме того, Linux, похоже, не полагается на аргументы от загрузчика, чтобы обнаружить протокол (возможно, через ATAG), что заставляет меня думать, что то, что я ищу, либо в коде ROM, либо в коде BL1. Вопрос в том, какой из них и, поскольку они непосредственно недоступны, где я могу найти детали о том, что они делают для моей доски (ODROID-XU) ... –
Я полагаю, вы имели в виду «т.е. помещение вторичных ядер в ждущий режим» –