工作设置
该存储库包含一个高度自动化的工作示例。特征:
- 适用于 QEMU 和 gem5
- 适用于arm和aarch64
- newlib 允许选择性地使用标准 C 库
- 半主机示例
- 适用于两者
RealViewPBX
and VExpress_GEM5_V1
。你应该更喜欢VExpress_GEM5_V1
因为它是一个更现代的平台。
- 使用 crosstool-NG 构建的原始工具链
关键实施点描述如下。
https://github.com/tukl-msd/gem5.bare-metal包含另一个工作设置并且更加简单,但目前功能较少。
arm
对于ARM来说没有什么特别的,你只需要找出UART地址和入口点地址,就像QEMU一样,然后通过--bare-metal
选项fs.py
:
fs.py --bare-metal
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 软件包。我已经调整了现有的arm配置并达到了这个工作配置.
然后,从 6fa49382ef22e1b01fb24503e3bbe5ab3556750a 开始,您必须传递 CLI 选项:
fs.py --param 'system.highest_el_is_64 = True' \
--param 'system.auto_reset_addr = True' \
--bare-metal
(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
as:
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)
半主机部分是可选的,但超级方便,请参阅:如何在gem5中启用ARM半主机?其他选项是强制性的。
在 Ubuntu 18.04 主机上测试。