Производительность jaihouse на AM5728
Чтобы проверить производительность Jailhouse в реальном времени, Sitara AM5728 была настроена на запуск Linux на одном из ядер ARM Cortex A15 и inmate TI-RTOS на другом ядре A15. Был выполнен тест для измерения задержки прерываний. Производительность приложения на основе драйвера режима опроса inmate должна быть идентична системе без виртуализации в статической системе разделения, такой как Jailhouse. Все что требуется для анализа на основе прерываний, это необходимость совместного использования контроллера прерываний (GIC), который будет вводить некоторые помехи от Linux в приложение реального времени. Измерения, показанные ниже это более миллиона прерываний, ясно показывают помехи и фиксируют верхнюю границу 8,8 мкс. Для первого запуска теста задержки прерывания незагруженный Linux, работающий на ядре 0, находится в первом столбце. Во второй колонке Linux на ядре 0 запущен STREAM. STREAM является эталоном доступа к внешней памяти, который полностью использует количество выдающихся операций чтения и записи в память. Он масштабируется от отдельных процессоров до кластеров суперкомпьютеров, здесь он используется на уровне процессора. Он был выбран как представитель наихудшего режима доступа к памяти приложения на базе Linux на Cortex A15, по существу, с профилем доступа к памяти, таким как оптимизированная копия памяти. В AM5728 два ядра Cortex A15 совместно используют кэш L2 и доступ к остальной части SoC, которую тестирует тест STREAM, работающий на ядре 0, в то время как ядро 1 доступа GIC регистрируется для ответа на прерывание.
Задержка прерывания inmate из bare metal (core 1)
Ненагруженный linux на ядре 0 | На linux запущен STREAM benchmark ядро 0 | |
Счетчик прерываний
Bucket 1.6 мкс – 3.2 мкс |
99.3756% | 33.9323% |
Счетчик прерываний
Bucket 3.2 мкс – 6.4 мкс |
0.6244% | 66.0632% |
Счетчик прерываний
Bucket 6.4 мкс – 12.8 мкс |
нету | 0.0045% |
Минимальная задержка прерывания | 2.2 мкс | 1.8 мкс |
Максимальная задержка прерывания | 5.0 мкс | 8.8 мкс |
Сборка jailhouse из исходников
Исходники jailhouse расположены в $TI_SDK_PATH/board-support/extra-drivers/jailhouse-0.7 директории. Эта директория содержит следующие поддиректории:
- Документация
- ci – конфигурационные файлы для различных платформ. Скопируйте jailhouse-config-am57xx-evm.h файл внутрь hypervisor/include/jailhouse директории и переименуйте его в config.h
- configs – cell конфигурационные файлы
- driver – jailhouse.ko модуль ядра (код)
- hypervisor – гипервизор (код)
- inmates – inmates демки. Они также содержат код для ti_app inmate примеров.
- scripts
- tools – jailhouse утилиты для управления
У Makefile SDK верхнего уровня есть jailhouse_clean, jailhouse и jailhouse_install, которые могут быть использованы для очистки, сборки и установки jailhouse в целевой файловой системе.
Создание и запуск демо Ethercat Slave
Чтобы построить и запустить ethercat slave демо, вам необходимо установить PLSDK-РТ, PRSDK и PRU-ICSS-ETHERCAT-SLAVE собрать. Мы предполагаем, что у вас уже установлены первые два пакета SDK. PRU-ICSS-ETHERCAT-SLAVE может быть загружен с http://software-dl.ti.com/processor-industrial-sw/esd/PRU-ICSS-ETHERCAT-SLAVE/01_00_05_00/index_FDS.html.
После этого SDK установлен, вы может собрать Ethercat slave компоненты.
Если am572x-ethercat.cell еще не установлена на целевой файловой системе, соберите ее из makefile верхнего уровня PLSDK-RT “make jailhouse” и скопируйте ее в target по следующему пути /usr/share/jailhouse/examples. Для построения ethercat_slave_demo.bin необходимо сделать следующее:
- модифицировать IA_SDK_HOME в~/ti/processor_sdk_rtos_am57xx_[version]/demos/jailhouse-inmate/rtos/ethercat_slave_demo/Makefile для указания каталога установки PRU-ICSS-ETHERCAT-SLAVE.
- В ~/ti/processor_sdk_rtos_am57xx_[version]/demos/jailhouse-inmate/makefile: добавить ethercat_slave_demo* запись, как pruss-test/icss-emac-test в конец makefile
ethercat_slave_demo: $(MAKE) -C ./rtos/ethercat_slave_demo ethercat_slave_demo_clean: $(MAKE) -C ./rtos/ethercat_slave_demo clean ethercat_slave_demo_install: $(MAKE) -C ./rtos/ethercat_slave_demo install
- cd ~/ti/processor_sdk_rtos_am57xx_[version]/
- source setupenv.sh
- cd ~/ti/processor_sdk_rtos_am57xx_[version]/demos/jailhouse-inmate
- source setenv.sh
- make ethercat_slave_demo
После шагов выше, копия ethercat_slave_demo.bin в целевой под /usr/share/jailhouse/examples.
Для запуска inmate обратитесь к инструкции по запуску демо на AM572x-IDK . Имейте в виду, что начальный адрес inmate-0x80000000. Таким образом, вам нужно использовать его в качестве параметра в команде ” jailhouse cell load:
jailhouse cell load 1 linux-loader.bin -a 0 -s "kernel=0x80000000" -a 0x100 ethercat_slave_demo.bin -a 0x80000000
Процедура проверки двусторонней связи между подчиненным inmate и главной станцией:
- см. http://processors.wiki.ti.com/index.php/PRU_ICSS_EtherCAT для настройки Ethercat master.
- Master: онлайн запись [data] в 32-битный выход RxPDO. После этого ведомое устройство должно сообщить соответствующее значение через Board_setDigOutput. Значение также можно проверить с помощью “devmem2 0xeef00000”.
- Slave: devmem2 0xeef00004 b [данные]. После этого Мастер должен отобразить соответствующее значение на 32-битном входе TXPDO
Внутренние компоненты jailhouse
В этом разделе приведены некоторые детали jailhouse и необходимые модификации ядра.
Модификации Linux ядра.
Для того чтобы запустить гипервизор и inamte jailhouse требуются дополнительные узлы в ядре dtb. Смотрите am572x-evm-jailhouse.dts и am572x-idk-jailhouse.dts. Они добавляют необходимые узлы или изменяют существующие узлы по умолчанию am57xx-evm-reva3.dts и am57xx-idk.dts DTS файлы.
Резервирование памяти
Ядру Linux необходимо зарезервировать память для гипервизора jailhouse и inmate. Эта память должна быть зарезервирована статически. В этом релизе мы зарезервировали 16 МБ физической памяти для гипервизора и 16 МБ для inmate.
/ { reserved-memory { jailhouse: jailhouse@ef000000 { reg = <0x0 0xef000000 0x0 0x1000000>; no-map; status = "okay"; }; jh_inmate: jh_inmate@ee000000 { reg = <0x0 0xee000000 0x0 0x1000000>; no-map; status = "okay"; }; }; };
Резервирование аппаратных модулей
Ядро Linux включает все модули SOC HW, необходимые для его настройки. Соответствующие драйверы настраивают необходимые таймеры и инициализируют регистры HW. Для всех неиспользуемых IPs таймеры не настроены. Также менеджер питания ядра может перевести модуль в спящий режим. Jailhouse inmate не имеет общего аппаратного модуля с ядром Linux (кроме отладочного UART). Но inmate не настраивает необходимые таймеры и не имеет дело с доменами питаниями (power domain). Таким образом, мы по-прежнему передаем ядро Linux (по крайней мере, в текущем релизе) для настройки таймеров на модуле HW inmate. Если мы хотим использовать некоторые аппаратные модули для inmate, мы должны заранее сообщить об этом kernel. Следующие узлы отключают использование таймера 8 и uart 9 ядром. Кроме того, это ограничивает ядро, чтобы поместить эти IPs в спящий режим.
&timer8 { status = "disabled"; ti,no-idle; }; &uart9 { status = "disabled"; ti,no-idle; };
Вы можете увидеть другие узлы в jailhouse DTS, которые резервируют другие IPs для использования inmate. Таким образом, DTS IDK отключает узлы, IPs которых используются для inmate icss_emac и pruss.
Резервирование входов прерываний GIC
Линии прерываний от аппаратных модулей не идут непосредственно к контроллеру прерываний ARM (GIC). Они идут к crossbar регистру, который выбирает входной сигнал распределителя GIC. Выбор производится динамически ядром Linux. Linux отслеживает все используемые и неиспользуемые входные данные GIC. Если jailhouse inmate должен использовать прерывание, он должен сам настроить crossbar регистр. Чтобы предотвратить конфликт между Linux crossbar manager и inmate, и дать inmate некоторые неиспользуемые входы GIC, которые он может использовать, нам нужно зарезервировать некоторые из них в ядре dts. Это может быть сделано путем добавления GIC ввода цифр к “ti,irqs-skip” свойство “crossbar_mpu:” узла. Линии 134 и 135 добавляются к следующему узлу.
crossbar_mpu: crossbar@4a002a48 { ti,irqs-skip = <10 133 134 135 139 140>; };
Примечание: icss_emac.bin использует гораздо больше линий прерываний. Вот почему dtb IDK пропускает дополнительные прерывания.
crossbar_mpu: crossbar@4a002a48 { ti,irqs-skip = <10 44 127 129 133 134 135 136 137 139 140>; };
Конфигурация корневой cell
Когда гипервизор включен, он создает cell для Linux и перемещает ее в эту cell. Cell называется “корневая cell”. Конфигурация cell как “*.c” файл, который компилируется в специальный двоичный формат “*.cell” файл. Гипервизор использует файл “cell” для создания cell. Конфигурация cell описывает области памяти и их атрибуты, которые будут использоваться cell,
.mem_regions = { /* OCMCRAM */ { .phys_start = 0x40300000, .virt_start = 0x40300000, .size = 0x80000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_IO, }, /* 0x40380000 - 0x48020000 */ { .phys_start = 0x40380000, .virt_start = 0x40380000, .size = 0x7ca0000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_IO, }, /* UART... */ { .phys_start = 0x48020000, .virt_start = 0x48020000, .size = 0xe0000,//0x00001000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_IO, }, ... /* RAM */ { .phys_start = 0x80000000, .virt_start = 0x80000000, .size = 0x6F000000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_EXECUTE, }, /* Leave hole for hypervisor */ /* RAM */ { .phys_start = 0xF0000000, .virt_start = 0xF0000000, .size = 0x10000000, .flags = JAILHOUSE_MEM_READ | JAILHOUSE_MEM_WRITE | JAILHOUSE_MEM_EXECUTE, },
Битовая карта ядер ЦП, выделенных для cell,
.cpus = { 0x3, },
Битовая карта прерываний контроллера SPI прерываний
.irqchips = { /* GIC */ { .address = 0x48211000, .pin_base = 32, .pin_bitmap = { 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }, }, /* GIC */ { .address = 0x48211000, .pin_base = 160, .pin_bitmap = { 0xffffffff, 0, 0, 0 }, }, },
и некоторые другие параметры. То есть для всех cell.
Кроме того, корневая cell также выделяет физическую память для гипервизора.
.hypervisor_memory = { .phys_start = 0xef000000, .size = 0x1000000, },
Раздел” области памяти ” используется гипервизором для создания таблицы преобразования MMU второго этапа. Обычно для корневой cell используется идентичное отображение – “VA = PA”. См. am57xx-evm.c является полной конфигурацией корневой cell am57xx-evm.