这是我的问题:
介绍
我目前正在尝试在 ARM 处理器上执行一些基本代码。由于我目前(可能很长一段时间)周围没有任何 ARM 硬件,所以我已经使用 QEMU(一个 ARM 仿真器)有几天了,我不得不说,它就像一个魅力. 但是使用 QEMU,我感觉就像拔剑杀苍蝇一样。所以我寻找了一些更轻的模拟器,并发现了 ARMulator。
“ARMulator 是一系列程序,可模拟各种 ARM 处理器及其支持架构的指令集。ARMulator 透明地连接到兼容的 ARM 调试器,以提供独立于硬件的 ARM 软件开发环境。通过远程调试接口 (RDI) 进行通信。”<br>(来源: http: //infocenter.arm.com/help/index.jsp ?topic=/com.arm.doc.dai0032f/index.html )
“准确度很好,虽然它被归类为周期计数准确而不是周期准确,这是因为 ARM 流水线没有完全建模(尽管寄存器互锁是)。解决方案是一条指令,因此当单步执行时,寄存器互锁被忽略,并且返回的循环计数与程序仅运行时不同,这是不可避免的。”<br>(来源:https://en.wikipedia。 org/wiki/ARMulator )
环境
从那里,我尝试了几个 ARMulator 版本。不得不说周围没有很多,事实上我只尝试了3个版本(名字不是官方的,这只是我给他们起的一个名字来识别他们):
-XYZ Armulator:https ://github.com/xyz /armulator 2016-02-20
- SourceForge Armulator:https ://sourceforge.net/projects/armulator/ 2013-04-26
- Phanrahan Armulator:https ://github.com/phanrahan/armulator 2014-11-11
我不确定这些版本是官方的,我想我在不同的网站上已经多次看到有一些版本是真正官方的,可能是专有的,并且包含的工具超出了所需的工具。以下是我正在谈论的一些示例:
- 在 ARM Connected Community 上,他们谈论了一个 RealViewDevelopmentSuite,它似乎包含 ARMulator:https
://community.arm.com/message/12272#12272
- ...当我添加其他人时再次找到其中一个但这些解决方案不是免费的。
现在关于工具链。我发现的资源中说明了两个不同的工具链:
- Arm-elf-abi:在 XYZ ARMulator GitHub 上说明,建议使用此命令($ arm-elf-gcc -mthumb -Bstatic -o)进行编译二进制可执行文件。
我找到的唯一版本是适用于 Windows 的……遗憾的是,我找不到适用于 Unix 的版本。
- Arm-none-eabi:在本教程中说明:http ://www.bravegnu.org/gnu-eprog/hello-arm.html ,这是我一直在使用 QEMU 的那个。我在某处读过在编译 ARM 程序集时不需要 Arm-elf 工具链,而 Arm-none 对于这种情况就足够了。
我测试的两个程序尽可能简单:
组装中的一个:helloarm.s
.global _start
.text
entry: b _start
.align
_start:
mov r4, #5 @ Load register r4 with the value 5
mov r3, #4 @ Load register r3 with the value 4
add r0, r4, r3 @ Add r3 and r4 and store in r0
b stop
stop: b stop @ Infinite loop
C中的一个:test.c
int c_entry() {
return 0;
}
编译过程
起初,我使用了与本教程中解释的 QEMU 相同的方法:http ://www.bravegnu.org/gnu-eprog/hello-arm.html 。在 QEMU 上,一切正常,但仿真过程略有不同。在执行 QEMU 之前,我必须先将二进制文件加载到 RAM 中。启动 ARMulator ($ armulator ) 的方式不同,我想自动加载的二进制文件是 RAM。
我尝试了三种不同的编译方式,不确定哪种最合适。这里是:
集会 :
$ arm-none-eabi-as –s -g helloarm.s -o helloarm.o
$ arm-none-eabi-ld -Ttext=0x0 -o helloarm.elf helloarm.o
$ arm-none-eabi-objcopy -O binary helloarm.elf helloarm.bin
我们现在应该有两个“二进制文件”,一个 .bin 和一个 .elf。
我仍然不知道有什么区别。需要多读一些。
C :
$ arm-none-eabi-gcc -mthumb -Bstatic --specs=nosys.specs srcs/main.c –o a.out
一个额外的:
我还尝试了本教程中解释的以下方法,这让我觉得 Armulator 是用来执行 .elf 二进制文件的。使用此方法创建的文件称为 c_entry。
https://balau82.wordpress.com/2010/02/14/simplest-bare-metal-program-for-arm/
问题是一样的。
从那时起,我们有 6 个二进制文件:
- helloarm.bin
helloarm.elf
主精灵
a.out
c_entry.bin
- c_entry.elf
问题
将 SourceForge 和 Phanrahan Armulator 与任何二进制文件(elf 或 bin)一起使用时:
$ ./armulator asm-helloarm.bin
打开文件 00000000.bin出错
$ ./armulator a.out
打开文件 00000000.bin 出错
$ ./armulator helloarm.elf
打开文件 00000000.bin 出错
使用 XYZ Armulator 时:
使用 helloarm.elf 二进制文件或任何 .elf 文件:
$ armulator helloarm.elf
错误:代码段外:0x24
* `armulator' 中的错误:双重释放或损坏(顶部):0x0000000001000550 *
======= 回溯:=========
/lib/x86_64-linux- gnu/libc.so.6(+0x77725)[0x7f0f32cf4725]
/lib/x86_64-linux-gnu/libc.so.6(+0x7ff4a)[0x7f0f32cfcf4a]
/lib/x86_64-linux-gnu/libc.so.6( cfree+0x4c)[0x7f0f32d00abc]
armulator[0x40489d]
armulator[0x4022d2]
armulator[0x401f3a]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf0)[0x7f0f32c9d830]
armulator[0x402109]
===== == 内存映射:========
00400000-0040e000 r-xp 00000000 08:01 3802861 /usr/local/bin/armulator
0060d000-0060e000 r--p 0000d000 08:01 3802861 /usr/local/bin/armulator
0060e000-0060f000 rw-p 0000e000 08:01 3802861 /usr/local/bin/armulator
00fe4000-01016000 rw-p 00000000 00:00 0 [HEAP]
7F0F2C0000-7F0F2C021000 RW-P 00000000 00:00 0
7F0F2C02C02C02C021000-7F0F0F30000000----- P 00000000 00:00 00:00 0
7F0F0F0F32974000-7F0F0F0F32A7CPE00S r-ib xp 000/14-lib r-ib xp 0000000000000000000000000000000000000000000000000000000000000000000000000000000来so
7f0f32a7c000-7f0f32c7b000 ---p 00108000 08:01 3281469 /lib/x86_64-linux-gnu/libm-2.23.so
7f0f32c7b000-7f0f32c7c000 r--p 00107000 08:01 3281469 /lib/x86_64-linux-gnu/libm- 2.23.so
7F0F32C7C000-7F0F32C7D000 RW-P 00108000 08:01 3281469/LIB/x86_64-linux-gnu/libm-2.23.so 7f0f0f32c7d000f32c7d000-7d000-7f32 000f32e32ebib
yuns r-xpp 00887878878788788788787887888788788787.132.32/liB
7f0f32e3d000-7f0f3303c000 ---p 001c0000 08:01 3281399 /lib/x86_64-linux-gnu/libc-2.23.so
7f0f3303c000-7f0f33040000 r--p 001bf000 08:01 3281399 /lib/x86_64-linux-gnu/libc-2.23 。
_
_
_ lib/x86_64-linux-gnu/libgcc_s.so.1
7F0F3305C000-7F0F3325B000 --- P 00016000 08:01 3281437/LIB/
x86_64-linux-gnu/libgcc_so.sso.1 7F0F333255B000-7F00S-7F00 1
7f0f3325c000-7f0f333ce000 r-xp 00000000 08:01 3672061 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0f333ce000-7f0f335ce000 ---p 00172000 1/usr/lib/08:01 -gnu/libstdc++.so.6.0.21
7f0f335ce000-7f0f335d8000 r--p 00172000 08:01 3672061 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0f335d8000-7f00-p:0017000 r 3672061 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21
7f0f335da000-7f0f335de000 rw-p 00000000 00:00 0
7f0f335de000-7f0f33604000 r-xp 00000000 08:01 3281371 /lib/x86_64-linux-gnu/ld-2.23.so
7f0f337e1000-7f0f337e6000 rw-p 00000000 00:00 0
7f0f33800000-7f0f33803000 rw-p 00000000 00:00 0
7f0f33803000-7f0f33804000 r--p 00025000 08:01 3281371 /lib/x86_64-linux-gnu/ld-2.23.so
7f0f33804000-7f0f33805000 rw-p 00026000 08:01 3281371 /lib/x86_64-linux-70/ldso-2.23.so
7f0f33805000 7F0F33806000 RW-P 000000 00 00 00 000 0
7FFC24C119000-7FFC24C3AA000 RW-P 00000000000000000000000000000000 :00 0 [stack ]
7ffc24000-7ffc24ca600s
vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
中止(核心转储)使用 helloarm.bin 二进制文件:
$ armulator helloarm.bin
分段错误(核心转储)
- 使用 GCC 编译的 C 二进制文件:
$ armulator a.out
意外指令:
可能的原因
- ARMulator 不知道如何解码某些指令。可能是这种情况,但我的程序似乎太基础了……它什么也不做,返回 0……<br> - 我使用了错误的工具链,或者错误地使用了正确的工具链。
- 不应以这种方式使用 Armulator。
注意
使用 arm-none-eabi-gdb 运行二进制文件时,我无法运行或启动程序。只有这个命令有效:target,但它只会将目标文件重置为已经选择的二进制文件。
当我键入 start 时,它显示“未加载符号表。使用“文件”命令。”</p>
提前感谢您的帮助,或者至少感谢您的阅读,
希望我不是唯一一个在 Armulator 上遇到困难的人。
问候,
约翰