xref: /dragonfly/lib/libc/sys/mmap.2 (revision f2187f0a)
1.\" Copyright (c) 1991, 1993
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. Neither the name of the University nor the names of its contributors
13.\"    may be used to endorse or promote products derived from this software
14.\"    without specific prior written permission.
15.\"
16.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
17.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
20.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26.\" SUCH DAMAGE.
27.\"
28.\"	@(#)mmap.2	8.4 (Berkeley) 5/11/95
29.\" $FreeBSD: src/lib/libc/sys/mmap.2,v 1.22.2.12 2002/02/27 03:40:13 dd Exp $
30.\"
31.Dd January 18, 2015
32.Dt MMAP 2
33.Os
34.Sh NAME
35.Nm mmap
36.Nd allocate memory, or map files or devices into memory
37.Sh LIBRARY
38.Lb libc
39.Sh SYNOPSIS
40.In sys/types.h
41.In sys/mman.h
42.Ft void *
43.Fn mmap "void *addr" "size_t len" "int prot" "int flags" "int fd" "off_t offset"
44.Sh DESCRIPTION
45The
46.Fn mmap
47function causes the pages starting at
48.Fa addr
49and continuing for at most
50.Fa len
51bytes to be mapped from the object described by
52.Fa fd ,
53starting at byte offset
54.Fa offset .
55If
56.Fa len
57is not a multiple of the pagesize, the mapped region may extend past the
58specified range.
59Any such extension beyond the end of the mapped object will be zero-filled.
60.Pp
61If
62.Fa addr
63is non-zero, it is used as a hint to the system.
64(As a convenience to the system, the actual address of the region may differ
65from the address supplied.)
66If
67.Fa addr
68is zero, an address will be selected by the system.
69The actual starting address of the region is returned.
70A successful
71.Fa mmap
72deletes any previous mapping in the allocated address range.
73.Pp
74The protections (region accessibility) are specified in the
75.Fa prot
76argument by
77.Em or Ns 'ing
78the following values:
79.Pp
80.Bl -tag -width ".Dv PROT_WRITE" -compact
81.It Dv PROT_NONE
82Pages may not be accessed.
83.It Dv PROT_READ
84Pages may be read.
85.It Dv PROT_WRITE
86Pages may be written.
87.It Dv PROT_EXEC
88Pages may be executed.
89.El
90.Pp
91The
92.Fa flags
93parameter specifies the type of the mapped object, mapping options and
94whether modifications made to the mapped copy of the page are private
95to the process or are to be shared with other references.
96Sharing, mapping type and options are specified in the
97.Fa flags
98argument by
99.Em or Ns 'ing
100the following values:
101.Bl -tag -width ".Dv MAP_HASSEMAPHORE"
102.It Dv MAP_ANON
103Map anonymous memory not associated with any specific file.
104The file descriptor used for creating
105.Dv MAP_ANON
106must be \-1.
107The
108.Fa offset
109parameter is ignored.
110.It Dv MAP_ANONYMOUS
111This flag is an alias for
112.Dv MAP_ANON
113and is provided for compatibility.
114.\".It Dv MAP_FILE
115.\"Mapped from a regular file or character-special device memory.
116.It Dv MAP_FIXED
117Do not permit the system to select a different address than the one
118specified.
119If the specified address contains other mappings those mappings will
120be replaced.
121If the specified address cannot otherwise be used,
122.Fn mmap
123will fail.
124If
125.Dv MAP_FIXED
126is specified,
127.Fa addr
128must be a multiple of the pagesize.
129.It Dv MAP_TRYFIXED
130Try to do a fixed mapping but fail if another mapping already exists in
131the space instead of overwriting the mapping.
132.Pp
133When used with
134.Dv MAP_STACK
135This flag creates a grow-down stack area with the specified maximum
136stack size.  This flag is no longer special-cased and will be converted
137to a normal anonymous mmap(), meaning that other mmap() calls cannot
138sub-map ungrown areas returned by prior MAP_STACK maps using TRYFIXED.
139The entire area is now applicable to the mapping.
140.Pp
141Note that the kernel itself can still create auto-grow areas but will
142do so for the user stack in order to maintain backwards compatibility
143with older code that might otherwise assume it can map below the user
144stack (in particular, older pthread libraries).  This compatibility is
145deprecated and will be removed in a future release.
146.It Dv MAP_HASSEMAPHORE
147Notify the kernel that the region may contain semaphores and that special
148handling may be necessary.
149.It Dv MAP_NOCORE
150Region is not included in a core file.
151.It Dv MAP_NOSYNC
152Causes data dirtied via this VM map to be flushed to physical media
153only when necessary (usually by the pager) rather than gratuitously.
154Typically this prevents the update daemons from flushing pages dirtied
155through such maps and thus allows efficient sharing of memory across
156unassociated processes using a file-backed shared memory map.
157Without
158this option any VM pages you dirty may be flushed to disk every so often
159(every 30-60 seconds usually) which can create performance problems if you
160do not need that to occur (such as when you are using shared file-backed
161mmap regions for IPC purposes).
162Note that VM/filesystem coherency is maintained whether you use
163.Dv MAP_NOSYNC
164or not.
165This option is not portable across
166.Ux
167platforms (yet), though some may implement the same behavior
168by default.
169.Pp
170.Em WARNING !
171Extending a file with
172.Xr ftruncate 2 ,
173thus creating a big hole, and then filling the hole by modifying a shared
174.Fn mmap
175can lead to severe file fragmentation.
176In order to avoid such fragmentation you should always pre-allocate the
177file's backing store by
178.Fn write Ns ing
179zero's into the newly extended area prior to modifying the area via your
180.Fn mmap .
181The fragmentation problem is especially sensitive to
182.Dv MAP_NOSYNC
183pages, because pages may be flushed to disk in a totally random order.
184.Pp
185The same applies when using
186.Dv MAP_NOSYNC
187to implement a file-based shared memory store.
188It is recommended that you create the backing store by
189.Fn write Ns ing
190zero's to the backing file rather than
191.Fn ftruncate Ns ing
192it.
193You can test file fragmentation by observing the KB/t (kilobytes per
194transfer) results from an
195.Dq Li iostat 1
196while reading a large file sequentially, e.g.,\& using
197.Dq Li dd if=filename of=/dev/null bs=32k .
198.Pp
199The
200.Xr fsync 2
201function will flush all dirty data and metadata associated with a file,
202including dirty NOSYNC VM data, to physical media.
203The
204.Xr sync 8
205command and
206.Xr sync 2
207system call generally do not flush dirty NOSYNC VM data.
208The
209.Xr msync 2
210system call is obsolete since
211.Bx
212implements a coherent filesystem buffer cache.
213However, it may be
214used to associate dirty VM pages with filesystem buffers and thus cause
215them to be flushed to physical media sooner rather than later.
216.It Dv MAP_PRIVATE
217Modifications are private.
218.It Dv MAP_SHARED
219Modifications are shared.
220.It Dv MAP_STACK
221Map the area as a stack.
222.Dv MAP_ANON
223is implied.
224.Fa Offset
225should be 0,
226.Fa fd
227must be -1, and
228.Fa prot
229should include at least
230.Dv PROT_READ
231and
232.Dv PROT_WRITE .
233This option creates
234a memory region that grows to at most
235.Fa len
236bytes in size, starting from the stack top and growing down.
237The stack top is the starting address returned by the call, plus
238.Fa len
239bytes.
240The bottom of the stack at maximum growth is the starting
241address returned by the call.
242.Pp
243The entire area is reserved from the point of view of other
244.Fn mmap
245calls, even if not faulted in yet.
246.Pp
247Note that unless
248.Dv MAP_FIXED
249or
250.Dv MAP_TRYFIXED
251is used, you cannot count on the returned address matching the hint
252you have provided.
253.It Dv MAP_VPAGETABLE
254Memory accessed via this map is not linearly mapped and will be governed
255by a virtual page table.
256The base address of the virtual page table may be set using
257.Xr mcontrol 2
258with
259.Dv MADV_SETMAP .
260Virtual page tables work with anonymous memory but there
261is no way to populate the page table so for all intents and purposes
262.Dv MAP_VPAGETABLE
263can only be used when mapping file descriptors.
264Since the kernel will update the
265.Dv VPTE_M
266bit in the virtual page table, the mapping must R+W
267even though actual access to the memory will be properly governed by
268the virtual page table.
269.Pp
270Addressable backing store is limited by the range supported in the virtual
271page table entries.
272The kernel may implement a page table abstraction capable
273of addressing a larger range within the backing store then could otherwise
274be mapped into memory.
275.El
276.Pp
277The
278.Xr close 2
279function does not unmap pages, see
280.Xr munmap 2
281for further information.
282.Pp
283The current design does not allow a process to specify the location of
284swap space.
285In the future we may define an additional mapping type,
286.Dv MAP_SWAP ,
287in which
288the file descriptor argument specifies a file or device to which swapping
289should be done.
290.Sh RETURN VALUES
291Upon successful completion,
292.Fn mmap
293returns a pointer to the mapped region.
294Otherwise, a value of
295.Dv MAP_FAILED
296is returned and
297.Va errno
298is set to indicate the error.
299.Sh ERRORS
300.Fn Mmap
301will fail if:
302.Bl -tag -width Er
303.It Bq Er EACCES
304The flag
305.Dv PROT_READ
306was specified as part of the
307.Fa prot
308parameter and
309.Fa fd
310was not open for reading.
311The flags
312.Dv MAP_SHARED
313and
314.Dv PROT_WRITE
315were specified as part of the
316.Fa flags
317and
318.Fa prot
319parameters and
320.Fa fd
321was not open for writing.
322.It Bq Er EBADF
323.Fa fd
324is not a valid open file descriptor.
325.It Bq Er EINVAL
326.Dv MAP_FIXED
327was specified and the
328.Fa addr
329parameter was not page aligned, or part of the desired address space
330resides out of the valid address space for a user process.
331.It Bq Er EINVAL
332.Fa Len
333was negative.
334.It Bq Er EINVAL
335.Dv MAP_ANON
336was specified and the
337.Fa fd
338parameter was not -1.
339.It Bq Er EINVAL
340.Dv MAP_ANON
341has not been specified and
342.Fa fd
343did not reference a regular or character special file.
344.It Bq Er EINVAL
345.Fa Offset
346was not page-aligned.
347.It Bq Er ENOMEM
348.Dv MAP_FIXED
349was specified and the
350.Fa addr
351parameter wasn't available.
352.Dv MAP_ANON
353was specified and insufficient memory was available.
354The system has reached the per-process mmap limit specified in the
355.Va vm.max_proc_mmap
356sysctl.
357.El
358.Sh SEE ALSO
359.Xr madvise 2 ,
360.Xr mincore 2 ,
361.Xr mlock 2 ,
362.Xr mprotect 2 ,
363.Xr msync 2 ,
364.Xr munlock 2 ,
365.Xr munmap 2 ,
366.Xr getpagesize 3
367