Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
MMAP(2)			      System Calls Manual		       MMAP(2)

NAME
       mmap -- allocate	memory,	or map files or	devices	into memory

LIBRARY
       Standard	C Library (libc, -lc)

SYNOPSIS
       #include	<sys/types.h>
       #include	<sys/mman.h>

       void *
       mmap(void   *addr,   size_t   len,   int	  prot,	 int  flags,  int  fd,
	   off_t offset);

DESCRIPTION
       The mmap() function causes the pages starting at	 addr  and  continuing
       for  at	most  len  bytes to be mapped from the object described	by fd,
       starting	at byte	offset offset.	If len is not a	multiple of the	 page-
       size,  the mapped region	may extend past	the specified range.  Any such
       extension beyond	the end	of the mapped object will be zero-filled.

       If addr is non-zero, it is used as a hint to the	system.	 (As a	conve-
       nience  to the system, the actual address of the	region may differ from
       the address supplied.)  If addr is zero,	an address will	be selected by
       the system.  The	actual starting	address	of the region is returned.   A
       successful  mmap	 deletes any previous mapping in the allocated address
       range.

       The protections (region accessibility) are specified in the prot	 argu-
       ment by or'ing the following values:

       PROT_NONE   Pages may not be accessed.
       PROT_READ   Pages may be	read.
       PROT_WRITE  Pages may be	written.
       PROT_EXEC   Pages may be	executed.

       The  flags  parameter  specifies	the type of the	mapped object, mapping
       options and whether modifications made to the mapped copy of  the  page
       are  private  to	the process or are to be shared	with other references.
       Sharing,	mapping	type and options are specified in the  flags  argument
       by or'ing the following values:

       MAP_ANON		 Map anonymous memory not associated with any specific
			 file.	The file descriptor used for creating MAP_ANON
			 must be -1.  The offset parameter is ignored.

       MAP_FIXED	 Do  not  permit  the system to	select a different ad-
			 dress than the	one specified.	If the	specified  ad-
			 dress cannot be used, mmap() will fail.  If MAP_FIXED
			 is  specified,	 addr  must be a multiple of the page-
			 size.	Use of this option is discouraged.

       MAP_HASSEMAPHORE	 Notify	the kernel that	the region may	contain	 sema-
			 phores	and that special handling may be necessary.

       MAP_NOCORE	 Region	is not included	in a core file.

       MAP_NOSYNC	 Causes	 data dirtied via this VM map to be flushed to
			 physical media	only when necessary  (usually  by  the
			 pager)	rather then gratuitously.  Typically this pre-
			 vents	the update daemons from	flushing pages dirtied
			 through such maps and thus allows  efficient  sharing
			 of memory across unassociated processes using a file-
			 backed	shared memory map.  Without this option	any VM
			 pages you dirty may be	flushed	to disk	every so often
			 (every	 30-60	seconds	usually) which can create per-
			 formance problems if you do not need  that  to	 occur
			 (such	as  when you are using shared file-backed mmap
			 regions for IPC purposes).  Note  that	 VM/filesystem
			 coherency is maintained whether you use MAP_NOSYNC or
			 not.	This  option is	not portable across Unix plat-
			 forms (yet), though some may implement	the  same  be-
			 havior	by default.

			 WARNING!   Extending  a  file with ftruncate(2), thus
			 creating a big	hole, and then	filling	 the  hole  by
			 modifying  a  shared  mmap()  can lead	to severe file
			 fragmentation.	 In order to avoid such	 fragmentation
			 you  should  always  pre-allocate  the	file's backing
			 store by write()ing zero's into  the  newly  extended
			 area  prior  to  modifying  the area via your mmap().
			 The fragmentation problem is especially sensitive  to
			 MAP_NOSYNC  pages,  because  pages  may be flushed to
			 disk in a totally random order.

			 The same applies when using MAP_NOSYNC	to implement a
			 file-based shared memory store.   It  is  recommended
			 that  you  create  the	 backing  store	 by write()ing
			 zero's	to the backing file rather then	ftruncate()ing
			 it.  You can test file	fragmentation by observing the
			 KB/t (kilobytes per transfer) results from an "iostat
			 1" while reading a large file sequentially, e.g.  us-
			 ing "dd if=filename of=/dev/null bs=32k".

			 The  fsync(2)	function will flush all	dirty data and
			 metadata associated with a file, including dirty  NO-
			 SYNC VM data, to physical media.  The sync(8) command
			 and  sync(2) system call generally do not flush dirty
			 NOSYNC	VM data.  The msync(2) system call is obsolete
			 since BSD implements  a  coherent  filesystem	buffer
			 cache.	 However, it may be used to associate dirty VM
			 pages	with filesystem	buffers	and thus cause them to
			 be flushed  to	 physical  media  sooner  rather  then
			 later.

       MAP_PRIVATE	 Modifications are private.

       MAP_SHARED	 Modifications are shared.

       MAP_STACK	 This option is	only available if your system has been
			 compiled  with	 VM_STACK  defined  when compiling the
			 kernel.  This is the default for i386 only.  Consider
			 adding	-DVM_STACK to COPTFLAGS	in your	/etc/make.conf
			 to  enable  this  option  for	other	architechures.
			 MAP_STACK implies MAP_ANON, and offset	of 0.  fd must
			 be  -1	 and  prot must	include	at least PROT_READ and
			 PROT_WRITE.  This option creates a memory region that
			 grows to at most len bytes in size, starting from the
			 stack top and growing down.  The  stack  top  is  the
			 starting  address  returned  by  the  call,  plus len
			 bytes.	 The bottom of the stack at maximum growth  is
			 the starting address returned by the call.

       The  close(2)  function does not	unmap pages, see munmap(2) for further
       information.

       The current design does not allow a process to specify the location  of
       swap  space.   In  the future we	may define an additional mapping type,
       MAP_SWAP, in which the file descriptor argument specifies a file	or de-
       vice to which swapping should be	done.

RETURN VALUES
       Upon successful completion, mmap() returns a pointer to the mapped  re-
       gion.  Otherwise, a value of MAP_FAILED is returned and errno is	set to
       indicate	the error.

ERRORS
       Mmap() will fail	if:

       [EACCES]		  The flag PROT_READ was specified as part of the prot
			  parameter  and  fd  was  not	open for reading.  The
			  flags	MAP_SHARED and PROT_WRITE  were	 specified  as
			  part of the flags and	prot parameters	and fd was not
			  open for writing.

       [EBADF]		  fd is	not a valid open file descriptor.

       [EINVAL]		  MAP_FIXED  was  specified and	the addr parameter was
			  not page aligned, or part  of	 the  desired  address
			  space	 resides  out of the valid address space for a
			  user process.

       [EINVAL]		  Len was negative.

       [EINVAL]		  MAP_ANON was specified and the fd parameter was  not
			  -1.

       [EINVAL]		  MAP_ANON  has	not been specified and fd did not ref-
			  erence a regular or character	special	file.

       [EINVAL]		  Offset was not page-aligned.	(See "BUGS" below.)

       [ENOMEM]		  MAP_FIXED  was  specified  and  the  addr  parameter
			  wasn't available.  MAP_ANON was specified and	insuf-
			  ficient   memory  was	 available.   The  system  has
			  reached the per-process mmap limit specified in  the
			  vm.max_proc_mmap sysctl.

SEE ALSO
       madvise(2),  mincore(2),	 mlock(2),  mprotect(2), msync(2), munlock(2),
       munmap(2), getpagesize(3)

BUGS
       len is limited to 2GB.  Mmapping	slightly more than 2GB	doesn't	 work,
       but  it	is  possible to	map a window of	size (filesize % 2GB) for file
       sizes of	slightly less than 2G, 4GB, 6GB	and 8GB.

       The limit is imposed for	a variety of reasons.  Most of them have to do
       with FreeBSD not	wanting	to use 64 bit offsets in the VM	system due  to
       the  extreme  performance  penalty.  So FreeBSD uses 32bit page indexes
       and this	gives FreeBSD a	maximum	of 8TB filesizes.  It's	actually  bugs
       in  the	filesystem code	that causes the	limit to be further restricted
       to 1TB (loss of precision when doing blockno calculations).

       Another reason for the 2GB limit	is that	filesystem metadata can	reside
       at negative offsets.

FreeBSD	4.8		       November	17, 2001		       MMAP(2)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=mmap&sektion=2&manpath=FreeBSD+4.8-RELEASE>

home | help