]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - share/man/man4/mem.4
mem(4): Improve ioctl section formatting
[FreeBSD/FreeBSD.git] / share / man / man4 / mem.4
1 .\" Copyright (c) 1991 The Regents of the University of California.
2 .\" 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 .\"     @(#)mem.4       5.3 (Berkeley) 5/2/91
29 .\" $FreeBSD$
30 .\"
31 .Dd March 11, 2022
32 .Dt MEM 4
33 .Os
34 .Sh NAME
35 .Nm mem ,
36 .Nm kmem
37 .Nd memory files
38 .Sh SYNOPSIS
39 .Cd "device mem"
40 .Sh DESCRIPTION
41 The special file
42 .Pa /dev/mem
43 is an interface to the physical memory of the computer.
44 Byte offsets in this file are interpreted as physical memory addresses.
45 Reading and writing this file is equivalent to reading and writing
46 memory itself.
47 Only offsets within the bounds of
48 .Pa /dev/mem
49 are allowed.
50 .Pp
51 Kernel virtual memory is accessed through the interface
52 .Pa /dev/kmem
53 in the same manner as
54 .Pa /dev/mem .
55 Only kernel virtual addresses that are currently mapped to memory are allowed.
56 .Pp
57 On ISA the I/O memory space begins at physical address 0x000a0000
58 and runs to 0x00100000.
59 The
60 per-process data
61 size
62 for the current process
63 is
64 .Dv UPAGES
65 long, and ends at virtual
66 address 0xf0000000.
67 .Sh IOCTL INTERFACE
68 .Ss Address Properties
69 The
70 .Dv MEM_EXTRACT_PADDR
71 ioctl can be used to look up the physical address and NUMA domain of a given
72 virtual address in the calling process' address space.
73 The request is described by
74 .Bd -literal
75 struct mem_extract {
76         uint64_t        me_vaddr;       /* input */
77         uint64_t        me_paddr;       /* output */
78         int             me_domain;      /* output */
79         int             me_state;       /* output */
80 };
81 .Ed
82 .Pp
83 The ioctl returns an error if the address is not valid.
84 The information returned by
85 .Dv MEM_EXTRACT_PADDR
86 may be out of date by the time that the ioctl call returns.
87 Specifically, concurrent system calls, page faults, or system page reclamation
88 activity may have unmapped the virtual page or replaced the backing physical
89 page before the ioctl call returns.
90 Wired pages, e.g., those locked by
91 .Xr mlock 2 ,
92 will not be reclaimed by the system.
93 .Pp
94 The
95 .Fa me_state
96 field provides information about the state of the virtual page:
97 .Bl -tag -width indent
98 .It Dv ME_STATE_INVALID
99 The virtual address is invalid.
100 .It Dv ME_STATE_VALID
101 The virtual address is valid but is not mapped at the time of the ioctl call.
102 .It Dv ME_STATE_MAPPED
103 The virtual address corresponds to a physical page mapping, and the
104 .Fa me_paddr
105 and
106 .Fa me_domain
107 fields are valid.
108 .El
109 .Ss Memory Ranges
110 .Pp
111 Several architectures allow attributes to be associated with ranges of physical
112 memory.
113 These attributes can be manipulated via
114 .Fn ioctl
115 calls performed on
116 .Pa /dev/mem .
117 Declarations and data types are to be found in
118 .In sys/memrange.h .
119 .Pp
120 The specific attributes, and number of programmable ranges may vary between
121 architectures.
122 The full set of supported attributes is:
123 .Bl -tag -width indent
124 .It Dv MDF_UNCACHEABLE
125 The region is not cached.
126 .It Dv MDF_WRITECOMBINE
127 Writes to the region may be combined or performed out of order.
128 .It Dv MDF_WRITETHROUGH
129 Writes to the region are committed synchronously.
130 .It Dv MDF_WRITEBACK
131 Writes to the region are committed asynchronously.
132 .It Dv MDF_WRITEPROTECT
133 The region cannot be written to.
134 .El
135 .Pp
136 Memory ranges are described by
137 .Bd -literal
138 struct mem_range_desc {
139         uint64_t        mr_base;        /* physical base address */
140         uint64_t        mr_len;         /* physical length of region */
141         int             mr_flags;       /* attributes of region */
142         char            mr_owner[8];
143 };
144 .Ed
145 .Pp
146 In addition to the region attributes listed above, the following flags
147 may also be set in the
148 .Fa mr_flags
149 field:
150 .Bl -tag -width indent
151 .It MDF_FIXBASE
152 The region's base address cannot be changed.
153 .It MDF_FIXLEN
154 The region's length cannot be changed.
155 .It MDF_FIRMWARE
156 The region is believed to have been established by the system firmware.
157 .It MDF_ACTIVE
158 The region is currently active.
159 .It MDF_BOGUS
160 We believe the region to be invalid or otherwise erroneous.
161 .It MDF_FIXACTIVE
162 The region cannot be disabled.
163 .It MDF_BUSY
164 The region is currently owned by another process and may not be
165 altered.
166 .El
167 .Pp
168 Operations are performed using
169 .Bd -literal
170 struct mem_range_op {
171         struct mem_range_desc   *mo_desc;
172         int                     mo_arg[2];
173 };
174 .Ed
175 .Pp
176 The
177 .Dv MEMRANGE_GET
178 ioctl is used to retrieve current memory range attributes.
179 If
180 .Va mo_arg[0]
181 is set to 0, it will be updated with the total number of memory range
182 descriptors.
183 If greater than 0, the array at
184 .Va mo_desc
185 will be filled with a corresponding number of descriptor structures,
186 or the maximum, whichever is less.
187 .Pp
188 The
189 .Dv MEMRANGE_SET
190 ioctl is used to add, alter and remove memory range attributes.
191 A range
192 with the
193 .Dv MDF_FIXACTIVE
194 flag may not be removed; a range with the
195 .Dv MDF_BUSY
196 flag may not be removed or updated.
197 .Pp
198 .Va mo_arg[0]
199 should be set to
200 .Dv MEMRANGE_SET_UPDATE
201 to update an existing or establish a new range, or to
202 .Dv MEMRANGE_SET_REMOVE
203 to remove a range.
204 .El
205 .Sh RETURN VALUES
206 .Ss MEM_EXTRACT_PADDR
207 The
208 .Dv MEM_EXTRACT_PADDR
209 ioctl always returns a value of zero.
210 .Ss MEMRANGE_GET/MEMRANGE_SET
211 .Bl -tag -width Er
212 .It Bq Er EOPNOTSUPP
213 Memory range operations are not supported on this architecture.
214 .It Bq Er ENXIO
215 No memory range descriptors are available (e.g., firmware has not enabled
216 any).
217 .It Bq Er EINVAL
218 The memory range supplied as an argument is invalid or overlaps another
219 range in a fashion not supported by this architecture.
220 .It Bq Er EBUSY
221 An attempt to remove or update a range failed because the range is busy.
222 .It Bq Er ENOSPC
223 An attempt to create a new range failed due to a shortage of hardware
224 resources (e.g., descriptor slots).
225 .It Bq Er ENOENT
226 An attempt to remove a range failed because no range matches the descriptor
227 base/length supplied.
228 .It Bq Er EPERM
229 An attempt to remove a range failed because the range is permanently
230 enabled.
231 .El
232 .Sh FILES
233 .Bl -tag -width /dev/kmem -compact
234 .It Pa /dev/mem
235 .It Pa /dev/kmem
236 .El
237 .Sh SEE ALSO
238 .Xr kvm 3 ,
239 .Xr memcontrol 8
240 .Sh HISTORY
241 The
242 .Nm mem
243 and
244 .Nm kmem
245 files appeared in
246 .At v6 .
247 The ioctl interface for memory range attributes was added in
248 .Fx 3.2 .
249 .Sh BUGS
250 Busy range attributes are not yet managed correctly.
251 .Pp
252 This device is required for all users of
253 .Xr kvm 3
254 to operate.