U-boot для загрузки двух образов на отдельных ядрах

У меня есть NXP/Free-scale Imx6 Sabre Lite для разработки. Моя задача - прошить два ядра ОС (Linux и RTOS) таким образом, чтобы linux работал на core0 и RTOS на core1. У меня есть 1 ГБ памяти DDR3, в которой я должен выделить первые 128 МБ для ОСРВ, а остальные - для образа LINUX.

  1. Как настроить U-boot в этом случае?
  2. core-0 должен загрузить ядро ​​Linux в области DDR3> 128 МБ, в то время как core1 в это время находится в состоянии ожидания.
  3. core-0 должен загрузить RTOS и передать управление на core-1.

Как я могу достичь этого сценария, используя U-Boot?

Пожалуйста, дайте мне знать, если кто-нибудь решил это!

Заранее спасибо!

0 ответов

Ну, это возможно, но я не думаю, что Uboot позволяет это с некоторыми исключениями. Некоторые поставщики предоставляют модифицированные двоичные файлы uboot со своими платами, которые поддерживают такую ​​функциональность. Например, Xilinx, предоставленный u-boot для ZCU102, позволяет загружать и вызывать ядра cortex-R из ядер cortex-a53, присутствующих в том же SOC.

Один из известных Open Source Framework OpenAMP делает эту работу. Это позволяет удаленно управлять жизненным циклом, а также устанавливает связь между несколькими ОС, работающими на разных ядрах. Но, насколько я помню, в настоящее время Sabre-Lite не поддерживается.

Важно в вашем случае: в вашем случае вы можете просто выполнить следующие шаги, чтобы выполнить свою работу.

Шаг 1. Убедитесь, что память, выделенная для RTOS, недоступна для Linux. Для этого вам нужно будет изменить файл dts, точнее узел памяти.

Шаг 2: Удалите устройства из dts, к которым вы хотите получить доступ из RTOS. Не удаляйте важные, такие как GIC. RTOS поделится этим с Linux, даже не подозревая об этом. Это единственный известный мне способ использования GIC в неконтролируемой среде. Это также отвечает на вопрос @AndrejsCainikovs, заданный в комментариях.

Шаг 3: Модифицируй бутарги от dts. Добавьте флаг nosmp в bootargs в dts.

Шаг 4: Постройте dts и замените уже помещенные dts в загрузочный раздел SD-карты.

Шаг 5: В вашем коде GIC прокомментируйте наш код сброса и инициализации. Пусть GIC находится в том состоянии, в котором он находится. Включите интерфейс процессора и те периферийные прерывания, которые вы будете использовать, и установите привязку их ЦП только к ядру RTOS. Теперь измените файл компоновщика, соберите и свяжите код RTOS для области памяти, которую вы только что удалили из области памяти Linux.

Шаг 6: Скопируйте двоичный файл RTOS в загрузочный раздел SD-карты.

Шаг 7: Запустите плату и остановите загрузку при автоматической загрузке. выполните следующую команду, чтобы загрузить образ RTOS в память.

    fatload mmc 0:1 0x10000000 rtos.bin;

Очевидно, вам нужно будет изменить адрес загрузки в соответствии с вашими адресами RTOS и может быть номером раздела mmc.

Шаг 8: Запустите ядро ​​Linux с помощью команды загрузки, и в ядре Linux вам нужно поиграть с некоторыми регистрами. Я бы решил сделать это, написав драйвер ядра и используя ioremap для сопоставления этих регистров и доступа к ним. Но вам решать, как вы это делаете, я объясняю здесь, что нужно сделать.

Запишите начальный адрес RTOS в регистр SRC_GPR3 для core1 или в SRC_GPR5 для core2 или SRC_GPR7 для core3.

Теперь включите ядро, используя 22-й, 23-й и 24-й биты регистра SRC_SCR для core1, core2 и core3 соответственно, на которых вы когда-либо собираетесь запускать ОСРВ. Обратите внимание, что core0 нельзя отключить или включить.

Теперь выведите ядро ​​из сброса, используя 13-й, 14-й, 15-й и 16-й биты регистра SRC_SCR для core0 core1, core2 и core3 соответственно. Ваша ОСРВ начнет работать.

Эта общая конфигурация формально называется неконтролируемыми системами, в отличие от контролируемых систем, которые используют гипервизор для строгого разделения ресурсов. Здесь каждая ОС работает с осторожностью, чтобы не трогать какие-либо ресурсы, назначенные другой ОС.

Адреса памяти этих регистров можно найти в справочном руководстве по процессору i.MX 6Dual/6Quad ​​Applications. Номер документа: IMX6DQRM

Другие вопросы по тегам