delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2005/11/26/17:10:54

X-Spam-Check-By: sourceware.org
X-Cloudmark-Score: 0.000000 []
X-T2-Posting-ID: dCnToGxhL58ot4EWY8b+QGwMembwLoz1X2yB7MdtIiA=
Date: Sat, 26 Nov 2005 22:47:01 +0100
From: Samuel Thibault <samuel DOT thibault AT ens-lyon DOT org>
To: cygwin AT cygwin DOT com
Subject: Re: mmap() on 64K aligned address fails
Message-ID: <20051126214701.GW5074@bouh.residence.ens-lyon.fr>
Mail-Followup-To: cygwin AT cygwin DOT com
References: <dm8oki$48t$1 AT sea DOT gmane DOT org> <20051126180331 DOT GI5074 AT bouh DOT residence DOT ens-lyon DOT fr> <dmajga$8lq$1 AT sea DOT gmane DOT org>
Mime-Version: 1.0
In-Reply-To: <dmajga$8lq$1@sea.gmane.org>
User-Agent: Mutt/1.5.9i-nntp
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Unsubscribe: <mailto:cygwin-unsubscribe-archive-cygwin=delorie DOT com AT cygwin DOT com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

René Berber, le Sat 26 Nov 2005 15:19:06 -0600, a écrit :
> Samuel Thibault wrote:
> [snip]
> > This seems odd. In the cygwin case, pagesize() would not be sufficient ??
> 
> No, in windows there is a requirement that mmap uses memory aligned to 64k (the
> infamous granularity).

Then the result of pagesize() is not sufficiently big: POSIX says that
mmap() can return EINVAL if « the address [...] is not a multiple of
the page size, or is considered invalid by the implementation ». Well,
we could consider non-16-pages-alignment as `considered invalid', but I
guess this expression was meant as `not in a mmap()-able area'.

> > And anyway, it should rather be 
> >    data2 = (char *) malloc (2 * 16 * pagesize);
> > Not only 16 (since it is further 16*pagesize -aligned).
> 
> It's enough to allocate 16 x pagesize to use one page for mmap-ing (like Corinna
> said in one message 15/16 pages will not be aligned -- but one will).  If you
> see the intermediate results I printed, data2 is re-aligned to 64k correctly.

Ah oops, didn't pay attention that the mmap was page-sized.  16 pages
are still not enough: if malloc() returns 0x0001 for instance, you'll
round up that to 16*pagesize, which is out the allocated area. 17 pages
are necessary.

BTW, I don't understand why using so complicated code:
p += (align - ((long) p & (align-1))) & (align-1)
Isn't
p = ((long) p + (align-1)) & (align-1)
both faster (tested) and more readable ?

Regards,
Samuel

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019