You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 14:29:55