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: mmap() on 64K aligned address fails


On Nov 27 16:47, Ren? Berber wrote:
> Samuel Thibault wrote:
> [snip]
> > Memmapping to malloced memory could very well be forbidden. Why would
> > one want to do this?
> 
> As I said before, the test is one that comes with gcc-4.0.2, it fails only on
> Windows as far as I know.  To answer your question: is just a test, it should
> work with some Windows related tweaking but it's just a test.
> 
> Besides, what other memory is there available that a process has under its
> control?  Yes, I know, mmap() should be used w/o MAP_FIXED and let the OS choose
> where to map, but the interesting part of this test is to use MAP_FIXED.

The problem is that the application using MAP_FIXED has no idea if the
address it's using is *allowed*.  There might be already a mapping
active, maybe just the application's code is mapped at that point, or
the address is generally invalid for shared memory usage.

Many mmap tests make such invalid assumptions about the memory.  Just
because they are part of gcc doesn't make them right.  The only blessed
usage of MAP_FIXED is if the application knows that the memory address
is valid.  One way to do this is to establish a non-FIXED mmap first,
like this:

  #include <stdio.h>
  #include <stdlib.h>
  #include <errno.h>
  #include <sys/mman.h>

  int
  main ()
  {
    int pages = 10;
    void *addr, *addr2;

    addr = mmap (NULL, 2 * pages * getpagesize(), PROT_READ|PROT_WRITE,
		 MAP_SHARED|MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED)
      fprintf (stderr, "Gargl\n");
    else
      {
	munmap (addr, pages * getpagesize());
	addr2 = mmap (addr, pages * getpagesize(), PROT_READ|PROT_WRITE,
		      MAP_SHARED|MAP_FIXED|MAP_ANONYMOUS, -1, 0);
	if (addr2 == MAP_FAILED)
	  fprintf (stderr, "Frtzl\n");
	else if (addr2 != addr)
	  fprintf (stderr, "Urgl\n");
	else
	  fprintf (stderr, "Haha\n");
      }
    return 0;
  }


Corinna

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

--
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/


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