On 2016年01月26日 18:26, Peter Maydell wrote: > On 26 January 2016 at 10:19, Chen Gang <cheng...@emindsoft.com.cn> wrote: >> When I run WeChat.exe with i386 wine with qemu-i386 under sw_64 arch. >> >> - The related command: >> >> "./i386-linux-user/qemu-i386 -strace -L /upstream/i386_wine >> /upstream/i386_wine/usr/local/bin/wine "C:\\Program >> Files\\Tencent\\WeChat\\WeChat.exe" > ana/try/info-strace.log 2>&1" >> >> - The related output (no any munmap, 135168 = 128KB + 4KB): >> >> 4600 >> mmap2(0x00340000,135168,PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,-1,0) >> = 0x00340000 >> 4600 mmap2(0x00340000,135168,PROT_READ,MAP_SHARED|MAP_FIXED,8,0) = >> 0x00340000 >> 4600 rt_sigprocmask(SIG_SETMASK,0x0033f574,NULL) = 0 >> 4600 rt_sigprocmask(SIG_BLOCK,0x7bced7e0,0x0033f5d0) = 0 >> 4600 write(3,0x33f6cc,64) = 64 >> 4600 read(4,0x33f6cc,64) = 1 >> 4600 rt_sigprocmask(SIG_SETMASK,0x0033f5d0,NULL) = 0 >> 4600 close(8) = 0 >> 4600 rt_sigprocmask(SIG_BLOCK,0x7bced7e0,0x0033f674) = 0 >> 4600 mprotect(0x00160000,65536,PROT_READ|PROT_WRITE) = 0 >> 4600 rt_sigprocmask(SIG_SETMASK,0x0033f674,NULL) = 0 >> 4600 rt_sigprocmask(SIG_BLOCK,0x7bced7e0,0x0033f990) = 0 >> 4600 >> mmap2(0x00340000,135168,PROT_NONE,MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED|MAP_NORESERVE,-1,0) >> = 0x00340000 >> >> wine often does like above, map the same position multiple times. > > That output seems to show all the mmap calls working fine, though. >
OK, thanks. >> >> For the case I provide above, it can call mmap_frag() twice for the same >> host page. > > For the same single call to target_mmap() ? What is the code flow > within QEMU that causes this? > Within one single call to target_mmap(), it should be OK. But multiple call to target_mmap(), may call mmap_frag() multiple times for the same host page (also for the same target page). In our case: - 4600 mmap2(0x00340000,135168,PROT_READ,MAP_PRIVATE|MAP_ANONYMOUS|MAP_FIXED,-1,0) = 0x00340000 It will call mmap_frag() with start address 0x00340000 + 128KB, and set the target page with PAGE_VALID. But left the half below host page without PAGE_VALID. - 4600 mmap2(0x00340000,135168,PROT_READ,MAP_SHARED|MAP_FIXED,8,0) = 0x00340000 It will call mmap_frag() with start address 0x00340000 + 128KB, and check the half below host page which has no PAGE_VALID, then "prot1 == 0", mmap_frag() thinks "no page was there, so we allocate one". - But in fact, the first mmap_frag() has already allocated one page at 0x00340000 + 128KB. Thanks. -- Chen Gang (陈刚) Open, share, and attitude like air, water, and life which God blessed