X-Recipient: archive-cygwin AT delorie DOT com X-Spam-Check-By: sourceware.org Date: Wed, 23 Mar 2011 14:26:22 +0100 From: Corinna Vinschen To: cygwin AT cygwin DOT com Subject: Re: Broken autoconf mmap test Message-ID: <20110323132622.GM31220@calimero.vinschen.de> Reply-To: cygwin AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com References: <4D8668C6 DOT 8020500 AT cornell DOT edu> <4D890D95 DOT 6090302 AT redhat DOT com> <4D891A55 DOT 6050601 AT cornell DOT edu> <20110323091921 DOT GB10657 AT calimero DOT vinschen DOT de> <4D89D4AA DOT 6070903 AT cornell DOT edu> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <4D89D4AA.6070903@cornell.edu> User-Agent: Mutt/1.5.21 (2010-09-15) Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner AT cygwin DOT com Mail-Followup-To: cygwin AT cygwin DOT com Delivered-To: mailing list cygwin AT cygwin DOT com 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 -- Corinna Vinschen Please, send mails regarding Cygwin to Cygwin Project Co-Leader cygwin AT cygwin DOT com Red Hat -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple