我使用 Verilator 设计了一个 MIPS I 模拟器,它允许我将 verilog 代码包装到 C++ 中。我试图在我的处理器上运行一个 C++ 程序,但我遇到了一些问题。我的目标是:
- 用c++写一个测试程序
- 使用交叉编译器 g++ (mips-linux) 编译这个程序
- 获取生成的 ELF 文件并使用 objdump 对其进行反汇编
- 将整个二进制对象转储存储在一个文本文件中
- 在我的模拟器中打开文本文件
- 运行一些文本操作函数来隔离 objdump 的 HEX 转储部分
- 将整个 elf 十六进制转储加载到我的处理器的内存中(一个 c++ 内存映射,其中包含由 ELF 文件定义的内存地址键控的元素。)
- 通过设置程序计数器来运行程序,直到退出程序系统调用为止。
问题是第 7 步和第 8 步。我对 ELF 文件格式有非常初步的了解。据我所知(readelf 可用于输出程序起点)程序计数器最初应设置在 .text 部分开头的地址。不幸的是,这样做并不能使程序在我的处理器上正常运行。
我已经通过编写汇编程序、将它们加载到 MIPS 汇编模拟器中并逐条指令验证寄存器文件和生成的寻址是否匹配来验证我的处理器程序是否正确执行。我不明白的是,为什么我连一个“helloworld”程序都无法通过用c++编写、编译并加载到我的“内存”中来运行?我在这个领域不是特别了解。我真的需要一些帮助来解决这个问题。
我的理解是 .text 和 .data 包含我的程序运行所需的一切。这显然不是这种情况,因为当我遍历 .text 部分时,我的程序没有正确执行。在将 ELF 文件加载到内存之前,我还需要对它做些什么吗?
最佳答案
我已经编写了一个可以加载 ELF 二进制文件的完整 MIPS I 模拟器。您可以获得源代码 here ,也许您会得到问题的答案。还包括一些演示程序。关键是让编译器生成一个独立可执行文件,它不使用任何运行时库,甚至不使用 gcc 的支持库。
关于c++ - 关于链接/加载和模拟器的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3231707/