[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags f
From: |
Chen Gang |
Subject: |
Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag() |
Date: |
Wed, 27 Jan 2016 09:37:44 +0800 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.5.1 |
On 2016年01月26日 18:26, Peter Maydell wrote:
> On 26 January 2016 at 10:19, Chen Gang <address@hidden> 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
- [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), chengang, 2016/01/11
- [Qemu-devel] [PATCH v2 2/3] linux-user/mmap.c: Remove useless variable p for mmap_frag, chengang, 2016/01/11
- [Qemu-devel] [PATCH v2 3/3] linux-user/mmap.c: Use TARGET_PAGE_SIZE as the increasing step, chengang, 2016/01/11
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Peter Maydell, 2016/01/25
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Chen Gang, 2016/01/25
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Peter Maydell, 2016/01/26
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Chen Gang, 2016/01/26
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Peter Maydell, 2016/01/26
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(),
Chen Gang <=
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Peter Maydell, 2016/01/28
- Re: [Qemu-devel] [PATCH v2 1/3] linux-user/mmap.c: Set prot page flags for the correct region in mmap_frag(), Chen Gang, 2016/01/28