]> git.saurik.com Git - apple/xnu.git/blame - bsd/man/man2/mmap.2
xnu-7195.101.1.tar.gz
[apple/xnu.git] / bsd / man / man2 / mmap.2
CommitLineData
9bccf70c
A
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.
9bccf70c
A
12.\" 4. 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.\"
b0d623f7
A
28.\" @(#)mmap.2 8.4 (Berkeley) 5/11/95
29.\" $FreeBSD: src/lib/libc/sys/mmap.2,v 1.56 2007/01/09 00:28:15 imp Exp $
9bccf70c 30.\"
f427ee49 31.Dd February 14, 2020
9bccf70c 32.Dt MMAP 2
b0d623f7 33.Os
9bccf70c
A
34.Sh NAME
35.Nm mmap
b0d623f7
A
36.Nd allocate memory, or map files or devices into memory
37.Sh LIBRARY
38.Lb libc
9bccf70c 39.Sh SYNOPSIS
b0d623f7 40.In sys/mman.h
9bccf70c 41.Ft void *
b0d623f7 42.Fn mmap "void *addr" "size_t len" "int prot" "int flags" "int fd" "off_t offset"
9bccf70c
A
43.Sh DESCRIPTION
44The
b0d623f7
A
45.Fn mmap
46system call causes the pages starting at
9bccf70c
A
47.Fa addr
48and continuing for at most
49.Fa len
50bytes to be mapped from the object described by
b0d623f7 51.Fa fd ,
9bccf70c
A
52starting at byte offset
53.Fa offset .
54If
55.Fa offset
56or
57.Fa len
58is not a multiple of the pagesize, the mapped region may extend past the
59specified range.
b0d623f7 60Any extension beyond the end of the mapped object will be zero-filled.
9bccf70c 61.Pp
b0d623f7
A
62The
63.Fa addr
64argument is used by the system to determine the starting address of the mapping,
65and its interpretation is dependent on the setting of the MAP_FIXED flag.
66If MAP_FIXED is specified in
67.Fa flags ,
f427ee49 68the system will try to place the mapping at the specified address,
b0d623f7
A
69possibly removing a
70mapping that already exists at that location.
71If MAP_FIXED is not specified,
72then the system will attempt to use the range of addresses starting at
9bccf70c 73.Fa addr
b0d623f7 74if they do not overlap any existing mappings,
f427ee49
A
75including memory allocated by
76.Xr malloc 3
77and other such allocators.
b0d623f7
A
78Otherwise,
79the system will choose an alternate address for the mapping (using an implementation
80dependent algorithm)
81that does not overlap any existing
82mappings.
83In other words,
f427ee49
A
84without
85.Dv MAP_FIXED
86the system will attempt to find an empty location in the address space if the
87specified address range has already been mapped by something else.
9bccf70c
A
88If
89.Fa addr
b0d623f7
A
90is zero and MAP_FIXED is not specified,
91then an address will be selected by the system so as not to overlap
92any existing mappings in the address space.
93In all cases,
94the actual starting address of the region is returned.
95If MAP_FIXED is specified,
96a successful
9bccf70c
A
97.Fa mmap
98deletes any previous mapping in the allocated address range.
b0d623f7 99Previous mappings are never deleted if MAP_FIXED is not specified.
9bccf70c
A
100.Pp
101The protections (region accessibility) are specified in the
102.Fa prot
103argument by
104.Em or Ns 'ing
105the following values:
106.Pp
b0d623f7
A
107.Bl -tag -width PROT_WRITE -compact
108.It Dv PROT_NONE
109Pages may not be accessed.
9bccf70c
A
110.It Dv PROT_READ
111Pages may be read.
112.It Dv PROT_WRITE
113Pages may be written.
b0d623f7
A
114.It Dv PROT_EXEC
115Pages may be executed.
9bccf70c
A
116.El
117.Pp
b0d623f7
A
118Note that, due to hardware limitations, on some platforms PROT_WRITE may
119imply PROT_READ, and PROT_READ may imply PROT_EXEC. Portable programs
f427ee49
A
120should not rely on these flags being separately enforceable.
121.Pp
122When the hardened runtime is enabled
123.Po
124See the links in the
125.Sx SEE ALSO
126section
127.Pc ,
128the protections cannot be both
129.Dv PROT_WRITE
130and
131.Dv PROT_EXEC
132without also having the flag
133.Dv MAP_JIT
134and the process possessing the
135.Dv com.apple.security.cs.allow-jit
136entitlement
b0d623f7 137.Pp
9bccf70c
A
138The
139.Fa flags
b0d623f7
A
140argument specifies the type of the mapped object, mapping options and
141whether modifications made to the mapped copy of the page are private
142to the process (copy-on-write) or are to be shared with other references.
143Sharing, mapping type and options are specified in the
9bccf70c
A
144.Fa flags
145argument by
146.Em or Ns 'ing
147the following values:
b0d623f7 148.Bl -tag -width MAP_HASSEMAPHORE
3e170ce0
A
149.It Dv MAP_ANONYMOUS
150Synonym for
151.Dv MAP_ANON.
9bccf70c
A
152.It Dv MAP_ANON
153Map anonymous memory not associated with any specific file.
b0d623f7
A
154The
155.Fa offset
156argument is ignored.
2d21ac55 157Mac OS X specific: the file descriptor used for creating
9bccf70c 158.Dv MAP_ANON
f427ee49
A
159regions can be used to pass some Mach VM flags, and can
160be specified as \-1 if no such flags are associated with
161the region. Mach VM flags are defined in
162.In mach/vm_statistics.h
163and the ones that currently apply
164to
2d21ac55
A
165.Nm mmap
166are:
167.Pp
39037602 168VM_FLAGS_PURGABLE to create Mach purgable (i.e. volatile) memory.
2d21ac55 169.Pp
39037602 170VM_MAKE_TAG(tag) to associate an 8-bit tag with the region.
b0d623f7 171.br
f427ee49
A
172.In mach/vm_statistics.h
173defines some preset tags (with a VM_MEMORY_ prefix).
2d21ac55 174Users are encouraged to use tags between 240 and 255.
f427ee49
A
175Tags are used by tools such as
176.Xr vmmap 1
177to help identify specific memory regions.
9bccf70c 178.It Dv MAP_FILE
b0d623f7 179Mapped from a regular file. (This is
9bccf70c
A
180the default mapping type, and need not be specified.)
181.It Dv MAP_FIXED
182Do not permit the system to select a different address than the one
183specified.
184If the specified address cannot be used,
b0d623f7 185.Fn mmap
9bccf70c 186will fail.
b0d623f7
A
187If
188.Dv MAP_FIXED
189is specified,
9bccf70c
A
190.Fa addr
191must be a multiple of the pagesize.
b0d623f7
A
192If a
193.Dv MAP_FIXED
194request is successful, the mapping established by
195.Fn mmap
196replaces any previous mappings for the process' pages in the range from
197.Fa addr
198to
199.Fa addr
200+
201.Fa len .
9bccf70c
A
202Use of this option is discouraged.
203.It Dv MAP_HASSEMAPHORE
204Notify the kernel that the region may contain semaphores and that special
205handling may be necessary.
9bccf70c 206.It Dv MAP_PRIVATE
2d21ac55 207Modifications are private (copy-on-write).
9bccf70c
A
208.It Dv MAP_SHARED
209Modifications are shared.
2d21ac55
A
210.It Dv MAP_NOCACHE
211Pages in this mapping are not retained in the kernel's memory cache.
212If the system runs low on memory, pages in MAP_NOCACHE mappings will be among
213the first to be reclaimed.
f427ee49 214This flag is intended for mappings that have little locality and
2d21ac55
A
215provides a hint to the kernel that pages in this mapping are unlikely to be needed
216again in the near future.
f427ee49
A
217.It Dv MAP_JIT
218Allow mapping pages both
219.Dv PROT_WRITE
220and
221.Dv PROT_EXEC
222when the hardened is runtime enabled. Without this flag an attempt to create a
223mapping with both
224.Dv PROT_WRITE
225and
226.Dv PROT_EXEC
227set will fail with
228.Dv MAP_FAILED
229on macOS. A writable, but not executable mapping
230is returned on iOS, watchOS and tvOS.
231.Pp
232Usage of this flag requires the caller to have the
233.Dv com.apple.security.cs.allow-jit
234entitlement on macOS.
235.It Dv MAP_32BIT
236Directs
237.Fn mmap
238to place the mapping into the first 4 Gigabytes of the process's address space. If
239there is no free virtual address space in this range,
240.Fn mmap
241will return
242.Dv MAP_FAILED.
243.Pp
244Note that in order for this flag to yield addresses below 4GiB, the program's
245PAGEZERO must be reduced in size, since the default PAGEZERO size for 64-bit
246programs is at least 4GiB.
9bccf70c
A
247.El
248.Pp
2d21ac55
A
249Conforming applications must specify either MAP_PRIVATE or MAP_SHARED.
250.Pp
b0d623f7 251The
9bccf70c 252.Xr close 2
b0d623f7 253system call does not unmap pages, see
9bccf70c
A
254.Xr munmap 2
255for further information.
256.Pp
257The current design does not allow a process to specify the location of
258swap space.
259In the future we may define an additional mapping type,
260.Dv MAP_SWAP ,
261in which
262the file descriptor argument specifies a file or device to which swapping
263should be done.
264.Sh RETURN VALUES
265Upon successful completion,
b0d623f7 266.Fn mmap
9bccf70c 267returns a pointer to the mapped region.
b0d623f7
A
268Otherwise, a value of
269.Dv MAP_FAILED
270is returned and
9bccf70c
A
271.Va errno
272is set to indicate the error.
273.Sh ERRORS
b0d623f7
A
274The
275.Fn mmap
276system call
9bccf70c
A
277will fail if:
278.Bl -tag -width Er
279.It Bq Er EACCES
b0d623f7
A
280The flag
281.Dv PROT_READ
282was specified as part of the
283.Fa prot
284argument and
285.Fa fd
286was not open for reading.
9bccf70c 287The flags
9bccf70c 288.Dv MAP_SHARED
b0d623f7
A
289and
290.Dv PROT_WRITE
291were specified as part of the
9bccf70c
A
292.Fa flags
293and
294.Fa prot
b0d623f7
A
295argument and
296.Fa fd
297was not open for writing.
9bccf70c 298.It Bq Er EBADF
b0d623f7
A
299The
300.Fa fd
301argument
302is not a valid open file descriptor.
9bccf70c
A
303.It Bq Er EINVAL
304.Dv MAP_FIXED
b0d623f7
A
305was specified and the
306.Fa addr
307argument was not page aligned, or part of the desired address space
308resides out of the valid address space for a user process.
2d21ac55
A
309.It Bq Er EINVAL
310.Fa flags
311does not include either MAP_PRIVATE or MAP_SHARED.
2d21ac55 312.It Bq Er EINVAL
f427ee49
A
313.Fa flags
314includes bits that are not part of any valid flags value.
315.It Bq Er EINVAL
b0d623f7 316The
2d21ac55 317.Fa len
b0d623f7 318argument
f427ee49
A
319was negative or zero. Historically, the system call would not return an error
320if the argument was zero.
321See other potential additional restrictions in the
322COMPATIBILITY section below.
2d21ac55 323.It Bq Er EINVAL
b0d623f7 324The
2d21ac55 325.Fa offset
b0d623f7
A
326argument
327was not page-aligned based on the page size as returned by getpagesize(3).
2d21ac55 328.It Bq Er ENODEV
b0d623f7
A
329.Dv MAP_ANON
330has not been specified and the file
331.Fa fd
332refers to does not support mapping.
9bccf70c
A
333.It Bq Er ENOMEM
334.Dv MAP_FIXED
b0d623f7 335was specified and the
9bccf70c 336.Fa addr
b0d623f7
A
337argument was not available.
338.Dv MAP_FIXED
339was specified and the address range specified exceeds the address space
340limit for the process.
9bccf70c 341.Dv MAP_ANON
b0d623f7 342was specified and insufficient memory was available.
2d21ac55 343.It Bq Er ENXIO
f427ee49 344Addresses in the specified range are invalid for
b0d623f7 345.Fa fd .
2d21ac55
A
346.It Bq Er EOVERFLOW
347Addresses in the specified range exceed the maximum offset
f427ee49 348set for
b0d623f7 349.Fa fd .
2d21ac55 350.El
f427ee49
A
351.Sh ENTITLEMENTS
352The following entitlements only have an effect when the hardened runtime is
353enabled.
354.Bl -tag -width Er
355.It Dv com.apple.security.cs.allow-jit
356A Boolean value that indicates whether the app may create writable and
357executable memory using the
358.Dv MAP_JIT
359.Fa flag .
360.It Dv com.apple.security.cs.allow-unsigned-executable-memory
361A Boolean value that indicates whether the app may create writable and
362executable memory without the restrictions imposed by using the
363.Dv MAP_JIT
364.Fa flag .
365.It Dv com.apple.security.cs.disable-executable-page-protection
366A Boolean value that indicates whether to disable all code signing
367protections while launching an application, and during its execution.
368.El
2d21ac55
A
369.Sh LEGACY SYNOPSIS
370.Fd #include <sys/types.h>
371.Fd #include <sys/mman.h>
372.Pp
373The include file
374.In sys/types.h
375is necessary.
376.Sh COMPATIBILITY
377.Fn mmap
378now returns with
379.Va errno
380set to EINVAL in places that historically succeeded.
381The rules have changed as follows:
382.Bl -bullet
383.It
384The
385.Fa flags
386parameter must specify either MAP_PRIVATE or MAP_SHARED.
387.It
388The
3e170ce0 389.Fa len
2d21ac55
A
390parameter must not be 0.
391.It
392The
393.Fa off
394parameter must be a multiple of pagesize,
395as returned by
396.Fn sysconf .
9bccf70c 397.El
f427ee49
A
398.Pp
399On macOS 10.14 Mojave the hardened runtime restricts pages from having both
400the
401.Dv PROT_WRITE
402and
403.Dv PROT_EXEC
404protections without the caller also setting the
405.Dv MAP_JIT
406.Fa flag
407and possessing the
408.Dv com.apple.security.cs.allow-jit
409entitlement.
b0d623f7 410.Sh SEE ALSO
9bccf70c
A
411.Xr madvise 2 ,
412.Xr mincore 2 ,
b0d623f7 413.Xr minherit 2 ,
2d21ac55
A
414.Xr mlock 2 ,
415.Xr mprotect 2 ,
416.Xr msync 2 ,
b0d623f7 417.Xr munlock 2 ,
2d21ac55 418.Xr munmap 2 ,
b0d623f7
A
419.Xr shmat 2 ,
420.Xr getpagesize 3
f427ee49
A
421.Ss Apple Developer Documentation
422https://developer.apple.com/documentation/security/hardened_runtime_entitlements