gpt4 book ai didi

c++ - Gem5 中的 UART 通信与 ARM 裸机

转载 作者:太空狗 更新时间:2023-10-29 21:13:35 26 4
gpt4 key购买 nike

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

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

任何帮助将不胜感激

最佳答案

工作设置

This repository contains a highly automated working example .特点:

  • 同时在 QEMU 和 gem5 上工作
  • 同时适用于 arm 和 aarch64
  • newlib 允许可选地使用标准 C 库
  • 半主机示例
  • 适用于 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 :

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 包。我已经调整了现有的 arm 配置并达到了 this working config .

然后,从 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 修补为:

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)

半主机部分是可选的,但 super 方便,参见:How to enable ARM semihosting in gem5?其他选项是强制性的。

在 Ubuntu 18.04 主机上测试。

关于c++ - Gem5 中的 UART 通信与 ARM 裸机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43682311/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com