Gem5 中与 ARM 裸机的 UART 通信

2023-12-14

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

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

任何帮助,将不胜感激


工作设置

该存储库包含一个高度自动化的工作示例。特征:

  • 适用于 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 主机上测试。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Gem5 中与 ARM 裸机的 UART 通信 的相关文章

随机推荐

  • 面向非美国开发者的 Paypal Android SDK

    我是一名非美国开发人员 正在构建一个也可以在美国境外运行的 Android 应用程序 我搜索了一段时间有关 Android SDK 何时在美国境外可用的信息 但没有找到任何信息 我正在寻找一种将 Paypal 支付与我的应用程序集成的方法
  • Unix 文件名中应限制哪些字符?

    考虑一个Save As带有自由文本条目的对话框 用户可以在其中输入文件名作为自由文本 然后单击Save按钮 然后 软件会验证文件名 如果名称有效则保存文件 在 Unix 文件系统上 验证中应应用哪些规则 以后在转义特殊字符等方面操作该名称并
  • 找不到管道“safeResourceUrl”

    由于我正在尝试将 YouTube 视频动态嵌入到我的 Angular 2 应用程序中 因此正在努力解决一些安全错误 在这里找到了关于使用 Pipe 来清理 url 的答案 但是遇到这个当前错误 找不到管道 safeResourceUrl S
  • Java加载二进制文件

    请告诉我最好 最快的方法 1 将非常小的二进制文件加载到内存中 例如图标 2 加载 读取大小为 512Mb 的非常大的二进制文件 也许我必须使用内存映射IO 3 当您不想考虑大小 速度而只需要做一件事时 您的常见选择 将所有字节读入内存 谢
  • 消除GOT寄存器的冗余负载?

    我正在处理一些在编译为 PIC 位置无关代码 时速度慢 70 80 的代码 并寻找缓解该问题的方法 问题的一个重要部分是 gcc 坚持在每个函数中插入以下内容 call i686 get pc thunk bx addl GLOBAL OF
  • SV 或 UVM 中的正则表达式

    我需要调用哪些函数才能在 Systemverilog UVM 中使用正则表达式 注意 我不是问如何使用正则表达式 只是问方法名称 首先 如果您想使用正则表达式 您需要确保您使用的是与其 DPI 代码一起编译的 UVM 库 即UVM NO D
  • 验证 Rails 中的网站所有权

    有关类似主题的最新讨论 请检查this问题出来了 验证特定用户是否拥有网站所有权的最佳方法是什么 假设您有这个模型 class User lt ActiveRecord Base has many websites end 为了确保用户确实
  • 如何使用 YouTube API 获取特定直播视频的当前观看人数?

    如何使用YouTube API获取实时视频的当前观看人数 我可以使用视频源请求来查看当前观看者的数量 如下所示 它会返回随机视频 但我需要获取特定视频的当前观看者 所以当我使用视频请求时 像这样 当前没有Viewers字段 在线查看Coun
  • 获取 BigQuery 项目中所有 BigQuery 表的上次访问日期

    我知道如何获取表上次修改但未访问的日期 是否可以获得最后一次读取表的时间 是否有查询或 API 可以获取此信息 如果你有审计日志在 BigQuery 中 您可以编写如下查询 WITH tables AS SELECT FORMAT s s
  • JPA ManyToMany 对于用户和组?

    同样的问题在这里 但这对我没有帮助 我有三个表和多对多连接 在我的 JSF 应用程序中 我尝试添加用户 在我的组表中 有三个不同的组 管理员 客户和用户 我做了什么 将数据插入 jsf 表单后 用户单击 保存 名为 usersControl
  • 将淡入淡出效果应用于 UICollectionView 的顶部和底部

    我已经阅读了这里的示例 但我无法按照我想要的方式进行操作 不知何故 我的渐变示例卡在屏幕中间 无法按预期工作 我有一个UICollectionView它用垂直滚动填充整个屏幕 我想要顶部和底部UICollectionView为黑色 中间为透
  • fill() 之后设置矩阵中的值返回不正确的矩阵[重复]

    这个问题在这里已经有答案了 如果我像这样初始化矩阵 x O O O O O O O O O 然后设置x 0 1 X 它返回 O X O O O O O O O 正如预期的那样 但是 如果我按如下方式初始化矩阵 x new Array 3 f
  • 级联下拉菜单删除先前选定的内容

    我正在尝试在 html 中添加 7 个下拉框 它们都将填充相同的数据 我想做的是 当选择第一个下拉列表时 它将从下一个下拉列表中删除所选项目 因此 如果您在一个下拉列表中有数字 A B C D E F G H I 如果我在第一个下拉列表中选
  • 如何在symfony中检索带有ID的一条记录之后的所有记录?

    假设我有一个表 我在 symfony 中按字母顺序排序 每个项目都有一个相当随机的 ID 我想检索某个 ID 之后的所有项目 例如 Name ID Apple 5 Banana 9 Coconut 3 Date 1 Eggplant 8 假
  • Google Chrome 开发工具中的交叉样式属性是什么意思?

    使用 Chrome 的开发工具检查元素时 在元素选项卡中 右侧的 样式 栏会显示相应的 CSS 属性 有时 其中一些属性会被删除 这些属性意味着什么 当 CSS 属性显示为删除线时 意味着应用了划掉的样式 但随后被更具体的选择器 更本地化的
  • 运行并行进程并在其中一个失败时退出所有进程

    我有这段代码 首先make t1 make t2 and make t3在平行下 有没有一种方法可以在 make 进程失败时终止其余进程 例如 如果make t2失败 脚本应该终止其他 2 个正在运行的脚本 make t1 and make
  • 我可以在谷歌地图路线上放置多少个标记有限制吗?

    我可以在谷歌地图路线上放置多少个标记有限制吗 如果是 如何克服 我的开发人员说他不能在路线上添加超过 10 个标记 是的 我在网上找不到任何与此相关的内容 TIA 根据文档 for v3 允许的最大航路点为 8 个 加上出发地和目的地 Ma
  • 如何从node-mongodb本机驱动程序获取db实例?

    考虑一下 我在 main 中打开了 MongoDB 连接app js文件本身和以下代码落在它的回调中 mongodb connect MongoDBUrlGoesHere function err db app listen app get
  • CSS 当有 2 个类时不推荐使用单个类

    有一个 div 它有 2 个类名 like div class A B 我想要的是如果有 A B 它将被弃用 A AND B 样式 仅使用 A B style 是否可以 如果一个元素有类A 那么它有类A 并且您不能通过添加另一个类来 关闭它
  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置