我无法发现你做错了什么,但我可以提供一个最小的独立工作示例,该示例仅适用于一个命令:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a#count-instructions https://github.com/cirosantilli/linux-kernel-module-cheat/tree/467923860b78bb5d0c787f1433682dfc9c83223a#count-instructions
克隆后执行以下操作:
./run -n -- -trace exec_tb,file=trace
./qemu/scripts/simpletrace.py qemu/trace-events trace >trace.txt
wc -l trace
你就会看到痕迹。
For ARM:
./run -a arm -- -trace exec_tb,file=trace
也许这会让你找出问题所在。
Buildroot 所做的确切 QEMU 配置行是:
./configure --target-list="arm-softmmu" --prefix="/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/hos
t/usr" --interp-prefix=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/arm-buildroot-linux-uclibcgnueabi/sysroot --cc="/usr/bin/gcc" --host-cc="/usr
/bin/gcc" --python=/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/bin/python2 --extra-cflags="-O2 -I/home/ciro/bak/git/linux-kernel-module-cheat/bu
ildroot/output.arm~/host/usr/include" --extra-ldflags="-L/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/lib -L/home/ciro/bak/git/linux-kernel-module-ch
eat/buildroot/output.arm~/host/usr/lib -Wl,-rpath,/home/ciro/bak/git/linux-kernel-module-cheat/buildroot/output.arm~/host/usr/lib" --enable-debug --enable-sdl --extra-cflags='-
DDEBUG_PL061=1' --with-sdlabi=2.0
在 QEMU v2.7.0 上,完整的 QEMU 命令是:
./buildroot/output.x86_64~/host/usr/bin/qemu-system-x86_64 -m 128M -monitor telnet::45454,server,nowait -netdev user,hostfwd=tcp::45455-:45455,id=net0 -smp 1 -M pc -append 'root=/dev/vda nopat nokaslr norandmaps printk.devkmsg=on printk.time=y console=ttyS0 init=/poweroff.out' -device edu -device lkmc_pci_min -device virtio-net-pci,netdev=net0 -kernel ./buildroot/output.x86_64~/images/bzImage -nographic -trace exec_tb,file=trace -drive file='./buildroot/output.x86_64~/images/rootfs.ext2.qcow2,if=virtio,format=qcow2'
我还建议您一开始就不要--enable-trace-backends
,这导致后端更加简单,只是将内容吐出到标准输出,从而导致性能损失很大。也尝试一下GDB QEMU起来,应该很容易找出缺少什么。
更新2.11
- 跟踪事件已移至:accel/tcg/trace-events,如下所示https://github.com/cirosantilli/qemu/commit/8dbff6d3728ff78c4da74d667bb4833edade06aa https://github.com/cirosantilli/qemu/commit/8dbff6d3728ff78c4da74d667bb4833edade06aa
- 您必须使用生成的trace-events-all 文件,如下所示:https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0c2bd829d47f6815500420789ad765c7a125b54c#count-boot-instructions https://github.com/cirosantilli/linux-kernel-module-cheat/tree/0c2bd829d47f6815500420789ad765c7a125b54c#count-boot-instructions
-d in_asm
option
Edit: -d in_asm
alone 仅显示翻译块,因此如果一个块被执行多次,则不会显示多次。有一些额外的标志可以使其更加准确,请参阅:qemu 跟踪哪些指令? https://stackoverflow.com/questions/64847254/what-instructions-does-qemu-trace/64876198#64876198
自从我发现这个选项以来,我一直使用它来获取指令列表,而不是更复杂的跟踪后端:跟踪/分析说明 https://stackoverflow.com/questions/2971926/tracing-profiling-instructions/55635387#55635387
我预计性能不会那么好,但如果它对您来说足够好,就像我进行裸机/用户模式模拟时一样,那就去吧。