UART在Gem5中与手臂裸机中的通信

UART communication in Gem5 with ARM Bare-metal

本文关键字:裸机 通信 Gem5 UART      更新时间:2023-10-16

我目前正在使用Gem5,我必须通过UART从主机到ARMV8 Bare-Metal Option访问,所以我尝试了很多方法,但是我库存了。

您能否让我知道,如何将主机的串行端口映射到Bare-Metal类型编程中的ARMV8的串行端口。

任何帮助都将不胜感激

工作设置

此存储库包含一个高度自动化的工作示例。功能:

  • 在QEMU和GEM5上都有工作
  • 在ARM和AARCH64
  • 上都起作用
  • Newlib允许使用标准C库
  • 半host示例
  • RealViewPBXVExpress_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

可以在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)

入口点是直接从小精灵推导的,但是某些值无效。我只是踏上调试,直到找到这些值:

    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

(6FA49382EF22E1B01FB24503E3BBE5AB3556750A之前的auto_reset_addr_64(否则失败了:

fatal: Kernel is mapped to invalid location (not memory). kernelStart 0x(400000) - kernelEnd 0x(0) 0x400000:0

另一个关键补丁是:https://github.com/gem5/gem5/commit/3c3ca64b5f0d9eef7b1ce1c65cc65cc6e8e9147dd38

另外,您也可以修补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)

半轴构成部分是可选的,但是超级方便,请参阅:如何在Gem5中启用ARM半旋转?其他选项是强制性的。

在Ubuntu 18.04主机中测试。