This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Broken autoconf mmap test

On Mar 23 07:08, Ken Brown wrote:
> On 3/23/2011 5:19 AM, Corinna Vinschen wrote:
> >On Mar 22 17:53, Ken Brown wrote:
> >>In case it's relevant, my system is 64-bit Windows 7, with the most
> >>recent cygwin snapshot:
> >
> >It is relevant, but it has nothing to do with Windows 7.  Actually, the
> >autoconf mmap test is testing a scenario which does not work on 64 bit
> >Windows systems.  Here's what happens in a nutshell.
> >
> >The actual pagesize on Windows is 4K.  But there's something called
> >"allocation granularity" which is 64K.  If you request virtual memory on
> >Windows, the memory address is always aligned to the allocation
> >granularity boundary.  Even if you request 4K chunks, they are 64K
> >aligned.
> >
> >If you mmap anonymous memory, this is no big problem.  Cygwin always
> >requests memory in 64K chunks since Cygwin's pagesize is set to 64K.
> >
> >However, if you mmap a file, there's a problem.  The mapping always
> >starts on a 64K boundary, but it end on the next 4K boundary beyond EOF.
> >So, for a file of size 1 byte, the memory section will be 4K.  The other
> >60K following in the virtual address space are lost.  And they are not
> >allocated.  And i you try to access them you get a SEGV.
> >
> >Fortunately, Cygwin uses the native NT calls in mmap.  The native calls
> >support a flag called AT_ROUND_TO_PAGE, which allows to allocate memory
> >on a 4K boundary.  So what Cygwin does is to mmap the file, and then to
> >request virtual memory rounded to the next 4K page to fill the rest of
> >the 64K allocation area.  Now we have the full 64K allocated.
> >
> >Unfortunately this doesn't work on 64 bit Windows.  The reason is that
> >the WOW64 layer does not support the AT_ROUND_TO_PAGE flag.  If you try
> >to use it, the OS call returns STTAUS_INVALID_PARAMETER.  So you can't
> >allocate the remainder of the 64K allocation slot at all.
> >
> >Back to the autoconf mmap test.  What it does is to mmap a file of size
> >1 byte.  Then it tests each byte in the mapped page.  And since the
> >pagesize in Cygwin is 64K it tests all of 64K.
> >
> >Given the above description, you can now imagine this works fine on 32
> >bit Windows, but it crashes on 64 bit Windows.
> Thanks for the explanation, Corinna.  I've reported this to the
> autoconf list.

Btw., I just experimented with another flag which has not been exposed
to the Win32 API, and which is not officially documented.  It's called
AT_EXTENDABLE_FILE and allows to specify a view which is bigger than
the filesize.  I tried this on W7-64, and it works.  Just not exactly
as we need it.  The trailing pages are not commited but only reserved,
so accessing them still results in a SEGV.  And while commiting them
allows to run the autoconf testcase, it also changes the filesize of
the file on disk.  Oh well.


Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

Problem reports:
Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]