On 12/22/2024 4:17 AM, Corinna Vinschen wrote:
The point was that a pagesize of 4K is wrong from the POSIX point of
view.  I was pretty stubborn in understanding this myself, and it
took quite some time until I caved in and produced the aforementioned
patch back in 2005.

The reason (or rather, one example) is that you can't do this:

   fd = open ("file1", O_RDONLY);

   addr1 = mmap (NULL, 4096, PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
   addr2 = mmap (addr1 + 4096, 4096, PROT_READ, MAP_PRIVATE, fd, 0);

This fails on Windows because the allocation granularity is 64K.  So
even though the mapping at addr1 is (supposedly) only one pagesize of 4K
in size...

- the entire region [addr1,addr1+64K[ is now blocked for other mappings,
   and

- a mapping can only start at an address % 64K, so the "addr1+4096"
   expression doesn't work on Windows, because the mapping can only
   start at the next (or any other) 64K boundary.

Multiple assumptions around file mappings differ between Windows
and POSIX, and the most sane way to emulate POSIX on Windows in this
respect is to define the POSIX pagesize as the Windows allocation
granularity.
Thanks for explaining.  It makes sense now.

Ken

Reply via email to