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

FreeBSD Manual Pages

  
 
  

home | help
SHM_MAP(9)		 BSD Kernel Developer's	Manual		    SHM_MAP(9)

NAME
     shm_map, shm_unmap	-- map shared memory objects into the kernel's address
     space

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

     int
     shm_map(struct file *fp, size_t size, off_t offset, void **memp);

     int
     shm_unmap(struct file *fp,	void *mem, size_t size);

DESCRIPTION
     The shm_map() and shm_unmap() functions provide an	API for	mapping	shared
     memory objects into the kernel.  Shared memory objects are	created	by
     shm_open(2).  These objects can then be passed into the kernel via	file
     descriptors.

     A shared memory object cannot be shrunk while it is mapped	into the ker-
     nel.  This	is to avoid invalidating any pages that	may be wired into the
     kernel's address space.  Shared memory objects can	still be grown while
     mapped into the kernel.

     To	simplify the accounting	needed to enforce the above requirement, call-
     ers of this API are required to unmap the entire region mapped by
     shm_map() when calling shm_unmap().  Unmapping only a portion of the re-
     gion is not permitted.

     The shm_map() function locates the	shared memory object associated	with
     the open file fp.	It maps	the region of that object described by offset
     and size into the kernel's	address	space.	If it succeeds,	*memp will be
     set to the	start of the mapping.  All pages for the range will be wired
     into memory upon successful return.

     The shm_unmap() function unmaps a region previously mapped	by shm_map().
     The mem argument should match the value previously	returned in *memp, and
     the size argument should match the	value passed to	shm_map().

     Note that shm_map() will not hold an extra	reference on the open file fp
     for the lifetime of the mapping.  Instead,	the calling code is required
     to	do this	if it wishes to	use shm_unmap()	on the region in the future.

RETURN VALUES
     The shm_map() and shm_unmap() functions return zero on success or an er-
     ror on failure.

EXAMPLES
     The following function accepts a file descriptor for a shared memory ob-
     ject.  It maps the	first sixteen kilobytes	of the object into the kernel,
     performs some work	on that	address, and then unmaps the address before
     returning.

	   int
	   shm_example(int fd)
	   {
		   struct file *fp;
		   void	*mem;
		   int error;

		   error = fget(curthread, fd, CAP_MMAP, &fp);
		   if (error)
			   return (error);
		   error = shm_map(fp, 16384, 0, &mem);
		   if (error) {
			   fdrop(fp, curthread);
			   return (error);
		   }

		   /* Do something with	'mem'. */

		   error = shm_unmap(fp, mem, 16384);
		   fdrop(fp, curthread);
		   return (error);
	   }

ERRORS
     The shm_map() function returns the	following errors on failure:

     [EINVAL]		The open file fp is not	a shared memory	object.

     [EINVAL]		The requested region described by offset and size ex-
			tends beyond the end of	the shared memory object.

     [ENOMEM]		Insufficient address space was available.

     [EACCES]		The shared memory object could not be mapped due to a
			protection error.

     [EINVAL]		The shared memory object could not be mapped due to
			some other VM error.

     The shm_unmap() function returns the following errors on failure:

     [EINVAL]		The open file fp is not	a shared memory	object.

     [EINVAL]		The address range described by mem and size is not a
			valid address range.

     [EINVAL]		The address range described by mem and size is not
			backed by the shared memory object associated with the
			open file fp, or the address range does	not cover the
			entire mapping of the object.

SEE ALSO
     shm_open(2)

HISTORY
     This API was first	introduced in FreeBSD 10.0.

BSD			       December	14, 2011			   BSD

NAME | SYNOPSIS | DESCRIPTION | RETURN VALUES | EXAMPLES | ERRORS | SEE ALSO | HISTORY

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

home | help