Gem5中的UART通信与ARM裸机

时间:2017-04-28 14:11:51

标签: c++ qemu uart bare-metal gem5

我目前正在使用Gem5,我必须通过UART从我的主机访问ARMv8裸机选项,所以我尝试了很多方法,但我还没库存。

请告诉我,如何将我的主机串行端口映射到裸机类型编程的ARMv8串行端口。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:2)

工作设置

Try this out。功能:

  • 在QEMU和gem5上均可使用
  • 在arm和aarch64上均可工作
  • newlib允许选择使用标准C库
  • 以半托管为例
  • 可同时在RealViewPBXVExpress_GEM5_V1上使用。您应该选择VExpress_GEM5_V1,因为它是一个更现代的平台。
  • 使用crosstool-NG构建的原始工具链

关键实现点如下所述。

https://github.com/tukl-msd/gem5.bare-metal包含另一种有效的设置,虽然设置最少,但目前功能较少。

手臂

ARM没有什么特别的,您只需找出UART地址和入口点地址即可,就像QEMU一样。

可以在gem5源代码src/dev/arm/RealView.py上找到UART地址:

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某些值无效。我只是一步调试,直到找到these values

    if common.machine == 'VExpress_GEM5_V1':
        entry_address = 0x80000000
    elif common.machine == 'RealViewPBX':
        entry_address = 0x10000

aarch64

类似于arm,但需要一些额外的步骤。

首先,如果您想要Newlib,则必须自己构建工具链,因为Ubuntu没有aarch64软件包。我已经调整了现有的手臂配置,并达到了this working config

然后,从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)

半主机部分是可选的,但非常方便,请参阅:How to enable ARM semihosting in gem5?其他选项是必需的。

在Ubuntu 18.04主机上进行了测试。