Jailhouse гипервизор часть 2

 

Производительность 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.