В настоящее время я работаю с Gem5, и мне нужно получить доступ через UART с моего хоста к ARMv8 с опцией «голый металл», так что я много пробовал, но все же запасся.
Не могли бы вы, пожалуйста, дайте мне знать, как я могу сопоставить последовательный порт моего хоста с последовательным портом ARMv8 в программировании типа «голый металл».
Любая помощь будет оценена
Рабочие настройки
Попробуйте это. Особенности:
RealViewPBX
а также VExpress_GEM5_V1
, Вы должны предпочесть VExpress_GEM5_V1
как это более современная платформа.Ключевые моменты реализации описаны ниже.
https://github.com/tukl-msd/gem5.bare-metal содержит другую рабочую настройку и является более минимальной, но в настоящее время имеет меньше возможностей.
рука
Для ARM нет ничего особенного, вам просто нужно узнать адрес UART и адрес точки входа, точно так же, как для QEMU.
Адрес UART можно найти в исходном коде gem5 src/dev/arm/RealView.py
:
class RealViewPBX(RealView):
uart = Pl011(pio_addr=0x10009000, int_num=44)
class VExpress_GEM5_V1(RealView):
uart0 = Pl011(pio_addr=0x1c090000, int_num=37)
Точка входа выводится непосредственно из ELF, но некоторые значения TODO недопустимы. Я просто шаг отлажен, пока не нашел эти значения:
if common.machine == 'VExpress_GEM5_V1':
entry_address = 0x80000000
elif common.machine == 'RealViewPBX':
entry_address = 0x10000
aarch64
Похожий на arm
, но требует нескольких дополнительных шагов.
Сначала вы должны собрать свой набор инструментов самостоятельно, если вы хотите Newlib, так как Ubuntu не имеет пакета aarch64. Я адаптировал существующую конфигурацию руки и достиг этот рабочий конфиг.
Затем, начиная с 6fa49382ef22e1b01fb24503e3bbe5ab3556750a, вы должны передать параметры CLI:
fs.py --param 'system.highest_el_is_64 = True' \
--param 'system.auto_reset_addr = True'
(auto_reset_addr_64
до 6fa49382ef22e1b01fb24503e3bbe5ab3556750a) в противном случае происходит сбой:
fatal: Kernel is mapped to invalid location (not memory). kernelStart 0x(400000) - kernelEnd 0x(0) 0x400000:0
Другой ключевой патч: https://github.com/gem5/gem5/commit/3c3ca64b5f0dd9eef7b1ce1c65cc6e8e9147dd38
В качестве альтернативы, вы также можете исправить fs.py
как:
diff --git a/configs/example/fs.py b/configs/example/fs.py
index 3997ed76c..286e0bca6 100644
--- a/configs/example/fs.py
+++ b/configs/example/fs.py
@@ -376,5 +376,9 @@ if buildEnv['TARGET_ISA'] == "arm" and options.generate_dtb:
sys = getattr(root, sysname)
sys.dtb_filename = create_dtb_for_system(sys, '%s.dtb' % sysname)
+from m5.objects import ArmSemihosting
+test_sys.semihosting = ArmSemihosting()
+test_sys.highest_el_is_64 = True
+test_sys.auto_reset_addr_64 = True
Simulation.setWorkCountOptions(test_sys, options)
Simulation.run(options, root, test_sys, FutureClass)
Часть полухостинга необязательна, но супер удобна, см .: Как включить ARM полухостинг в gem5? Другие варианты являются обязательными.
Протестировано в Ubuntu 18.04 на хосте.
Других решений пока нет …