关于QEMU用户态仿真内存映射不匹配问题的咨询
QEMU用户态仿真下Guest与Host内存映射不一致问题
我在QEMU用户态环境下运行i386二进制程序时,进程发起了如下系统调用:
ioctl(5, USBDEVFS_BULK, {129, 96, 5000, 0x080d6698})
其中用户态地址0x080d6698是ioctl的输出缓冲区。
用-d page参数运行QEMU时,能看到该地址处于guest进程的可写内存范围内:
page layout changed following mmap start end size prot 08048000-080d2000 0008a000 r-x 080d2000-080d4000 00002000 rw- 080d4000-080f7000 00023000 rw- <-- 目标地址在此范围 3fffd000-3ffff000 00002000 rw- 3ffff000-40000000 00001000 r-x 40000000-40001000 00001000 --- 40001000-40801000 00800000 rw-
但从宿主操作系统视角查看内存映射时,地址0x080d6698并未被映射:
00400000-00726000 r-xp 00000000 fd:00 506 /usr/local/bin/qemu-i386 00736000-0073a000 r--p 00326000 fd:00 506 /usr/local/bin/qemu-i386 0073a000-00751000 rw-p 0032a000 fd:00 506 /usr/local/bin/qemu-i386 00751000-00888000 rw-p 00000000 00:00 0 [heap] --- [address 0x080d6698 does not fall into any range] --- 4081a000-48862000 ---p 00000000 00:00 0 48862000-488ec000 r--p 00000000 fd:00 3189086 binary 488ec000-488ee000 rw-p 0008a000 fd:00 3189086 binary 488ee000-48911000 rw-p 00000000 00:00 0 48911000-80817000 ---p 00000000 00:00 0 80817000-80819000 rw-p 00000000 00:00 0 80819000-8081a000 r--p 00000000 00:00 0 8081a000-8081b000 ---p 00000000 00:00 0 8081b000-8101b000 rw-p 00000000 00:00 0 8101b000-140819000 ---p 00000000 00:00 0 ffffe8000000-ffffeffff000 rwxp 00000000 00:00 0 ffffeffff000-fffff0000000 ---p 00000000 00:00 0 fffff0000000-fffff0021000 rw-p 00000000 00:00 0 fffff0021000-fffff4000000 ---p 00000000 00:00 0 fffff777c000-fffff77fd000 rw-p 00000000 00:00 0 fffff77fd000-fffff77fe000 ---p 00000000 00:00 0 fffff77fe000-fffff7ffe000 rw-p 00000000 00:00 0 fffff7ffe000-fffff7fff000 r--p 00000000 00:00 0 [vvar] fffff7fff000-fffff8000000 r-xp 00000000 00:00 0 [vdso] fffffffdf000-1000000000000 rw-p 00000000 00:00 0 [stack]
我尝试计算:guest的内存范围080d4000-080f7000加上guest_base = 0x4081a000后,应该对应到宿主的488ee000-48911000范围。
另外我注意到,QEMU在64位主机上对32位guest仅做地址零扩展,不做转换映射。但为什么QEMU调试输出的内存映射和Linux报告的完全不一致?
内容的提问来源于stack exchange,提问作者rgov
相关产品推荐
相关产品推荐

