如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件?

2024-04-25

有许多可能的错误和解决方法分散在不同的地方,任何人都可以提供至少一种详细的工作设置,以及确切的 gem5 和编译器版本,希望在 Ubuntu 上吗?


最小的 Ubuntu 设置

首先要注意一件事:动态链接的可执行文件首先运行动态加载器,这意味着除了静态 ELF 的 pre main 内容之外还有更多的启动指令。因此,如果您有一个小型用户区测试,并且这种时间差恰好发生在“5 秒到 50 秒”的范围内,那么当您使用该测试用例迭代模拟器/测试用例补丁时,它可能会破坏您的生产力。例如,我观察到一个 C++ hello world 调试版本,其中 DerivO3CPU 在 6 秒内运行一个静态可执行文件,在 150 秒内运行一个动态可执行文件!

从 gem5 开始8162e0da0285d346046151b2a45ceeb1baf63b8f https://github.com/gem5/gem5/commit/8162e0da0285d346046151b2a45ceeb1baf63b8f2018 年 10 月,适用于所有 x86、arm 和 aarch64 的 C hello world 只能在 Ubuntu 16.04 和 18.04 上运行。 x86 之前可以工作,但该提交最终完成了一些必要的 Arm 更改以制作 glibc int 代码之前运行main https://electronics.stackexchange.com/questions/258896/what-happens-before-main/404298#404298好好工作。

给定 gem5 版本和 Ubuntu 版本之一,您可以运行以下 C 程序:

main.c

#include <stdio.h>

int main(int argc, char **argv) {
    size_t i;
    for (i = 0; i < (size_t)argc; ++i)
        printf("%s\n", argv[i]);
    return 0;
}

简单地说:

sudo apt-get install gcc
gcc -O0 -ggdb3 -std=c99 -static -o x86.out main.c
build/X86/gem5.opt \
  configs/example/se.py \
  -c x86.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-arm-linux-gnueabihf
arm-linux-gnueabihf-gcc -O0 -ggdb3 -std=c99 -static -o arm.out main.c
build/ARM/gem5.opt \
  configs/example/se.py \
  -c arm.out \
  -o 'asdf qwer' \
;

sudo apt-get install gcc-aarch64-linux-gnu
aarch64-linux-gnu-gcc -O0 -ggdb3 -std=c99 -static -o aarch64.out main.c
build/ARM/gem5.opt \
    configs/example/se.py \
    -c aarch64.out \
    -o 'asdf qwer' \
;

并且在所有情况下都会产生正确的输出:

asdf
qwer

-static如以下所述,ARM 上需要:如何在gem5中运行动态链接的可执行系统调用模拟模式se.py? https://stackoverflow.com/questions/50542222/how-to-run-a-dynamically-linked-executable-syscall-emulation-mode-se-py-in-gem5尽管不再需要它,但它仍然需要更少的 CLI 选项并且更易于使用。

Ubuntu 交叉编译器安装也提到:如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件? https://stackoverflow.com/questions/53085048/how-to-compile-and-run-an-executable-in-gem5-syscall-emulation-mode-with-se-py/53085049#53085049

还有一些 gem5 树内用户示例,其中一些具有适当的交叉编译支持,位于tests/test-progs https://github.com/gem5/gem5/tree/9fc9c67b4242c03f165951775be5cd0812f2a705/tests/test-progs.

如果有人在较新的 gem5 版本或 Ubuntu 版本中发现这样的最小 C 程序无法在前面提到的架构之一中正确执行的设置,请发送一封电子邮件,详细描述您的系统设置到邮件列表并抄送给我。

缺少系统调用

当然,当您尝试运行更复杂的用户态程序时,您将不可避免地遇到未实现的系统调用,因为其中有很多。

请不要将这些报告为错误,除非它们出现在最小 C 示例的 glibc 设置代码中,因为我们已经有了源代码本身缺少的系统调用的列表。

相反,不要犹豫,尝试修补程序!

许多系统调用的实现都很简单,例如8162e0da0285d346046151b2a45ceeb1baf63b8f https://github.com/gem5/gem5/commit/8162e0da0285d346046151b2a45ceeb1baf63b8f.

另外,您也可以将系统调用标记为忽略ignoreFunc,如果您认为跳过它们不会显着影响执行,请参阅例如:https://github.com/gem5/gem5/blob/8162e0da0285d346046151b2a45ceeb1baf63b8f/src/arch/arm/linux/process.cc#L161 https://github.com/gem5/gem5/blob/8162e0da0285d346046151b2a45ceeb1baf63b8f/src/arch/arm/linux/process.cc#L161

只有这样,如果您尝试了补丁但失败了,请开始向邮件列表中的人员发送 ping 消息,并寻求有关如何使您的补丁发挥作用的指导。

Related:

  • gem5 系统调用模拟 OpenBLAS cblas_dgemm 失败并显示“致命:系统调用 mbind (#237) 未实现” https://stackoverflow.com/questions/49227682/gem5-syscall-emulation-openblas-cblas-dgemm-fails-with-fatal-syscall-mbind-2/49278729#49278729
  • gem5 系统调用模拟 arm C hello world 失败并显示“致命:系统调用 gettid (#224) 未实现” https://stackoverflow.com/questions/51256193/gem5-syscall-emulation-arm-c-hello-world-fails-with-fatal-syscall-gettid-224/51266763#51266763

多线程

TODO 这是一个已知的主要痛点。我不知道状态如何,但我听说它很不稳定。

最近使 ARM 正常工作的修复

由于事情不可避免地会再次出现问题,您也许可以从我们所做的以下修复中获得一些灵感,并可能自己修复问题:

  • FATAL: kernel too old: 在系统调用模拟 SE 模式下运行 gem5 时如何解决“FATAL: kernel too old”? https://stackoverflow.com/questions/48959349/how-to-solve-fatal-kernel-too-old-when-running-gem5-in-syscall-emulation-se-m修复者:260b0fc5381a47c681e7ead8e4f13aad45069665 https://github.com/gem5/gem5/commit/260b0fc5381a47c681e7ead8e4f13aad45069665
  • openat未实施。 Ubuntu 18.04上的glibc ARM启动代码开始使用它,这打破了hello world。修复者:8162e0da0285d346046151b2a45ceeb1baf63b8f https://github.com/gem5/gem5/commit/8162e0da0285d346046151b2a45ceeb1baf63b8f
  • panic: Attempted to execute unimplemented instruction 'mrs'。修复者:6efe7e1abf9d289859eb23b52b3a319f15f2736a https://github.com/gem5/gem5/commit/6efe7e1abf9d289859eb23b52b3a319f15f2736a。通过手动解码,执行的指令是mrs x0, midr_el1.

交叉工具-NG

使用 crosstool-NG 启用 ulibc 而不是 glibc 有时可以作为 glibc 初始化代码的解决方法,因为 ulibc 比 glibc 更精简,执行的代码更少。它并不理想,但如果您确实无法修补 gem5,则可能会起作用。描述于:在系统调用模拟 SE 模式下运行 gem5 时如何解决“FATAL: kernel too old”? https://stackoverflow.com/questions/48959349/how-to-solve-fatal-kernel-too-old-when-running-gem5-in-syscall-emulation-se-m

如果您还需要从头开始生成完整的系统映像,另一种可能性是使用 Buildroot 构建的交叉编译器,看这个例子 https://github.com/cirosantilli/linux-kernel-module-cheat/tree/e1d0a2fafbb35c9e65c1a8a0b6d46df3e9161461#userland-setup-getting-started.

还有一些可以跨编译器构建的树内脚本:util/build_cross_gcc https://github.com/gem5/gem5/tree/f41abbdb5cf5c67233f3d730885d43517969afda/util/build_cross_gcc但我只会使用 crosstool-NG 来排除与其他项目的交叉编译器的维护。

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

如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件? 的相关文章

  • 离子 3 角度 4 动画不起作用

    我有一个组件 我正在尝试为手风琴列表设置动画 我已经进行了所有更改 例如包括import BrowserModule from angular platform browser and import BrowserAnimationsMod
  • std::unordered_set 迭代器遍历的复杂性

    我最近玩了一个std unordered set http en cppreference com w cpp container unordered set 我怀疑我的 STL 版本会跟踪某些 FILO 数据结构 看起来像列表 中的非空存
  • Android JSON解析并存储到数据库

    我正在制作一个具有数据库的应用程序 现在我正在尝试从中解析数据值
  • Kafka Streams - 减少大型状态存储的内存占用

    我有一个拓扑 见下文 可以读取一个非常大的主题 每天超过十亿条消息 这个 Kafka Streams 应用程序的内存使用量相当高 我正在寻找一些关于如何减少状态存储占用空间的建议 更多详细信息如下 Note 我并不是想逃避国有商店 我只是认
  • 清除给定 iOS 应用程序的 cookie

    我的应用程序连接到服务器 并且基于 cookie 服务器将发出不同的响应 是否无法以编程方式清除cookie存储 以便服务器下次联系服务器时无法识别我的应用程序 据我所知 清除 Settings app 中的 Cookie 仅适用于 Saf
  • 如何用R中的频率表获得中位数? [复制]

    这个问题在这里已经有答案了 Problem 我改变了问题的表述 因为似乎缺乏清晰度 所以 我们有数千家医院 他们的患者年龄在 0 岁到 100 岁之间 对于每个年龄段 他们都有一定数量的患者 例如Hospital1 有 10 名 1 岁患者
  • 动态获取路由路径

    我最近将一些模板从 ERB 转换为 Haml 大多数情况下 它变得更干净 更好 但按钮定义开始变得糟糕 我想转换这个 link to t new default gt t helpers links new new intern path
  • Python ctypes 指向结构体指针的指针

    我在获取指向工作结构的指针时遇到问题 这是我抛出异常 ArgumentError 参数 1 预期 LP LP List 实例而不是指向 LP LP List 的指针 的代码 class List Structure fields head
  • 如何将额外参数传递给 R 中 do.call 的函数参数

    我想传递参数 stringsAsFactors FALSE to rbind in do call 但以下方法不起作用 data lt do call rbind strsplit readLines home jianfezhang ad

随机推荐

  • 用python计算逻辑回归

    我尝试计算逻辑回归 我有 csv 文件形式的数据 看起来像 node id second major gender major index year dorm high school student fac 0 0 2 257 2007 1
  • 为什么 ts-toolbelt 库使用“Oextendsunknown”表达式

    我正在研究 ts toolbelt 库的源代码 而我也经常遇到这样的表情O extends unknown 在我看来 它没有添加任何功能 所以我想知道 它是做什么用的 hidden export type UnionOf
  • Cypher - 匹配两个不同的可能路径并返回两者

    我有一个数据集 我在这里作为示例表示 http console neo4j org id 3dq78v http console neo4j org id 3dq78v 我想要做的是对于图表中的每个 Z 节点 该示例只有一个 但我有很多 我
  • 苹果组合框架:如何并行执行多个发布者并等待所有发布者完成?

    我正在发现组合 我编写了以 组合 方式发出 HTTP 请求的方法 例如 func testRawDataTaskPublisher for url URL gt AnyPublisher
  • 使用不同的配置文件设置 Git 的开发和测试分支

    我们有一个 WordPress 安装 它有不同的实时 测试 开发配置文件 我知道如何让 Git 忽略wp config php文件 但我想在每个分支中有一个不同的 WP config 文件 这样当开发人员切换到 Dev 时 它将使用 Dev
  • 龙卷风 websocket 应用程序中的用户身份验证

    现在 我提高了我的龙卷风技能 并有一个关于用户身份验证的问题 我的解决方案是在首页上创建安全令牌 然后将其与其他数据一起发送 从 javascript 到龙卷风服务器 在其中检查和验证用户 我想到了 cookie 但我不知道如何读取 coo
  • Sql Server 数据库项目 - VS 2013 中缺少模板

    在 VS2012 中 我使用 Sql Server 数据库项目来管理我的数据库 我尝试将 Db 项目添加到新的 VS2013 解决方案中 但我似乎找不到模板 我在网上和已安装的模板中查看过 有任何想法吗 对我来说 它列在 其他语言 下 我有
  • 将等号('=')传递给 MediaWiki 模板中的参数

    如何在模板参数中使用 字符而不破坏模板解析器 我不是 MediaWIKI 开发人员 所以我没有调试代码或检查日志 我希望这里有人提供转义传递给模板的字符的提示 使用以下内容创建一个名为 Test 的模板 1 像这样 Test R 3 2 1
  • 使用curl解压gzip数据

    I added curl easy setopt client CURLOPT ENCODING gzip 到我的代码 我预计curl 会导致服务器发送压缩数据并解压缩它 实际上我在 HTTP 标头中看到数据被压缩 变化 Accept En
  • Codility 的复杂性达到顶峰

    我刚刚完成了以下 CodilityPeaks http codility com demo take sample test peaks问题 问题如下 给出一个由 N 个整数组成的非空零索引数组 A 峰值是大于其邻居的数组元素 更准确地说
  • 如何使用 JAX-WS 将 SOAP 标头添加到 SOAP 请求?

    我们需要使用其他团队开发的网络服务 使用JAX WS用于生成网络服务 我们正在使用wsimport生成客户端存根 问题是我需要将以下信息作为标头与 SOAP 主体一起传递
  • 如何更改 Github/Markdown 中图像的大小?

    我正在 Github 存储库中编辑 Readme md 文件 并插入了一张图片 请参阅https github com khpeek FMCW 雷达 https github com khpeek FMCW radar 图片占据了整个宽度
  • 有点好奇了解 .NET 中的表达式树

    我读过几篇文章和几篇stackoverflow com关于表达式树的帖子 我的大脑很难理解 问题 1 像DOM 文档对象模型 一样 它是逻辑的内存表示 2 有人解释说它是一种将可执行 代码转换为数据的机制 使用它我们可以生成表示代码的数据结
  • Theano 中的名称冲突

    我正在尝试在模块中导入 theano 但我得到了回溯 File media tarun 6A86CA8286CA4DEF develop pydy pydy codegen code py line 16 in
  • SearchManager - 添加自定义建议

    我已经阅读了有关构建搜索界面和添加自定义建议的所有在线文档 但我仍然不清楚这是如何工作的 文档说我必须 为您的建议构建一个表 例如在 SQLiteDatabase 中 并使用所需的列格式化表 我假设系统最终会自己用适当的建议填充此表 但是哪
  • gitk:悬停时显示分支名称

    你能告诉我如何让 gitk 工具在悬停时显示分支名称或建议能够这样做的工具吗 gitk 显示分支缠结 其中分支是无名的 我必须猜测哪个是 master 哪个是 stable 等 在 gitk 窗口的左下半部分 有一个信息行指定Branche
  • Docker 上的 MySQL?

    我是 Docker 新手 仍在探索中 我遇到了这个问题 可能看起来很愚蠢 但我真的被困住了 所以我有一个使用 MySQL 服务器的 Spring boot 应用程序 我想在容器上运行我的应用程序 我设法 运行一个没有 MySQL 的应用程序
  • 在 model.fit() 期间记录 Keras 中每个时期的计算时间

    我想比较不同模型之间的计算时间 在拟合期间 每个时期的计算时间被打印到控制台 Epoch 5 5 160000 160000 10s 我正在寻找一种方法来存储这些时间 其方式与模型指标类似 模型指标保存在每个时期并可通过历史对象获取 尝试以
  • 通过 DynamicMethod 调用 varargs 方法

    我正在尝试使用 DynamicMethod 调用非托管的类似 printf 的函数 在运行时我得到一个 BadImageFormatException 找不到索引 HRESULT 的异常 0x80131124 这是运行时的限制还是我发出的代
  • 如何使用 se.py 在 gem5 系统调用模拟模式下编译和运行可执行文件?

    有许多可能的错误和解决方法分散在不同的地方 任何人都可以提供至少一种详细的工作设置 以及确切的 gem5 和编译器版本 希望在 Ubuntu 上吗 最小的 Ubuntu 设置 首先要注意一件事 动态链接的可执行文件首先运行动态加载器 这意味