1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
|
\input texinfo @c -*- Texinfo -*-
@setfilename mmalloc.info
@ifinfo
@format
START-INFO-DIR-ENTRY
* Mmalloc: (mmalloc). The GNU mapped-malloc package.
END-INFO-DIR-ENTRY
@end format
This file documents the GNU mmalloc (mapped-malloc) package, written by
fnf@@cygnus.com.
Copyright (C) 1992 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
@ignore
Permission is granted to process this file through Tex and print the
results, provided the printed document carries copying permission
notice identical to this one except for the removal of this paragraph
(this paragraph not being relevant to the printed manual).
@end ignore
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that the
entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end ifinfo
@iftex
@c @finalout
@setchapternewpage odd
@settitle MMALLOC, the GNU memory-mapped malloc package
@titlepage
@title mmalloc
@subtitle The GNU memory-mapped malloc package
@author Fred Fish
@author Cygnus Support
@page
@tex
\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$
\xdef\manvers{\$Revision$} % For use in headers, footers too
{\parskip=0pt
\hfill Cygnus Support\par
\hfill fnf\@cygnus.com\par
\hfill {\it MMALLOC, the GNU memory-mapped malloc package}, \manvers\par
\hfill \TeX{}info \texinfoversion\par
}
@end tex
@vskip 0pt plus 1filll
Copyright @copyright{} 1992 Free Software Foundation, Inc.
Permission is granted to make and distribute verbatim copies of
this manual provided the copyright notice and this permission notice
are preserved on all copies.
Permission is granted to copy and distribute modified versions of this
manual under the conditions for verbatim copying, provided also that
the entire resulting derived work is distributed under the terms of a
permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual
into another language, under the above conditions for modified versions.
@end titlepage
@end iftex
@ifinfo
@node Top, Overview, (dir), (dir)
@top mmalloc
This file documents the GNU memory-mapped malloc package mmalloc.
@menu
* Overview:: Overall Description
* Implementation:: Implementation
--- The Detailed Node Listing ---
Implementation
* Compatibility:: Backwards Compatibility
* Functions:: Function Descriptions
@end menu
@end ifinfo
@node Overview, Implementation, Top, Top
@chapter Overall Description
This is a heavily modified version of GNU @code{malloc}. It uses
@code{mmap} as the basic mechanism for for obtaining memory from the
system, rather than @code{sbrk}. This gives it several advantages over the
more traditional malloc:
@itemize @bullet
@item
Providing suitable precautions are taken to avoid memory region
collisions, @code{sbrk} is now available for use by applications that
use this package and still need to use some memory management
package that includes functions like @code{malloc}, @code{realloc}, and
@code{free}.
@item
Several different memory pools can be used, each of them growing
or shinking under control of @code{mmap}, with the @code{mmalloc} functions
using a specific pool on a call by call basis.
@item
By using @code{mmap}, it is easy to create data pools which are intended to
be persistent and exist as a filesystem object after the creating
process has gone away.
@item
Because multiple memory pools can be managed, data used for a
specific purpose can be allocated into its own memory pool, making
it easier to allow applications to ``dump'' and ``restore'' initialized
malloc-managed memory regions. For example, the ``unexec'' hack popularized
by GNU Emacs could potentially go away.
@end itemize
@node Implementation, , Overview, Top
@chapter Implementation
The @code{mmalloc} functions contain no internal static state. All
@code{mmalloc} internal data is allocated in the mapped in region, along
with the user data that it manages. This allows it to manage multiple
such regions and to ``pick up where it left off'' when such regions are
later dynamically mapped back in.
In some sense, malloc has been ``purified'' to contain no internal state
information and generalized to use multiple memory regions rather than a
single region managed by @code{sbrk}. However the new routines now need an
extra parameter which informs @code{mmalloc} which memory region it is dealing
with (along with other information). This parameter is called the
@dfn{malloc descriptor}.
For ease of initial implementation, and to avoid exporting or importing
any more global variables or routines than necessary, this package is
implemented with all functions contained within a single source file.
At some future point, once everything has stabilized, it may be desirable
to split it up into separate files.
The functions initially provided by @code{mmalloc} are:
@example
void *mmalloc_attach (int fd, void *baseaddr);
void *mmalloc_detach (void *md);
int mmalloc_errno (void *md);
int mmalloc_setkey (void *md, int keynum, void *key);
void *mmalloc_getkey (void *md, int keynum);
void *mmalloc (void *md, size_t size);
void *mrealloc (void *md, void *ptr, size_t size);
void *mvalloc (void *md, size_t size);
void mfree (void *md, void *ptr);
@end example
@menu
* Compatibility:: Backwards Compatibility
* Functions:: Function Descriptions
@end menu
@node Compatibility, Functions, Implementation, Implementation
@section Backwards Compatibility
To allow a single malloc package to be used in a given application,
provision is made for the traditional @code{malloc}, @code{realloc}, and
@code{free} functions to be implemented as special cases of the
@code{mmalloc} functions. In particular, if any of the functions that
expect malloc descriptors are called with a @code{NULL} pointer rather than a
valid malloc descriptor, then they default to using a memory-mapped region
starting at the current @code{sbrk} value and mapped to @file{/dev/zero}.
Applications can simply include the following defines to use the
@code{mmalloc} versions:
@example
#define malloc(size) mmalloc ((void *)0, (size))
#define realloc(ptr,size) mrealloc ((void *)0, (ptr), (size));
#define free(ptr) mfree ((void *)0, (ptr))
@end example
@noindent
or replace the existing @code{malloc}, @code{realloc}, and @code{free}
calls with the above patterns if using @code{#define} causes problems.
Note that this does not prevent calls to @code{malloc}, @code{realloc},
or @code{free} within libraries from continuing to use the library
version of malloc, so if this is a problem, the compatibility issue
needs to be dealt with in another way.
@node Functions, , Compatibility, Implementation
@section Function Descriptions
These are the details on the functions that make up the @code{mmalloc}
package.
@table @code
@item void *mmalloc_attach (int @var{fd}, void *@var{baseaddr});
Initialize access to a @code{mmalloc} managed region.
If @var{fd} is a valid file descriptor for an open file, then data for the
@code{mmalloc} managed region is mapped to that file. Otherwise
@file{/dev/zero} is used and the data will not exist in any filesystem object.
If the open file corresponding to @var{fd} is from a previous use of
@code{mmalloc} and passes some basic sanity checks to ensure that it is
compatible with the current @code{mmalloc} package, then its data is
mapped in and is immediately accessible at the same addresses in
the current process as the process that created the file.
If @var{baseaddr} is not @code{NULL}, the mapping is established
starting at the specified address in the process address space. If
@var{baseaddr} is @code{NULL}, the @code{mmalloc} package chooses a
suitable address at which to start the mapped region, which will be the
value of the previous mapping if opening an existing file which was
previously built by @code{mmalloc}, or for new files will be a value
chosen by @code{mmap}.
Specifying @var{baseaddr} provides more control over where the regions
start and how big they can be before bumping into existing mapped
regions or future mapped regions.
On success, returns a malloc descriptor which is used in subsequent
calls to other @code{mmalloc} package functions. It is explicitly
@samp{void *} (@samp{char *} for systems that don't fully support
@code{void}) so that users of the package don't have to worry about the
actual implementation details.
On failure returns @code{NULL}.
@item void *mmalloc_detach (void *@var{md});
Terminate access to a @code{mmalloc} managed region identified by the
descriptor @var{md}, by closing the base file and unmapping all memory
pages associated with the region.
Returns @code{NULL} on success.
Returns the malloc descriptor on failure, which can subsequently
be used for further action (such as obtaining more information about
the nature of the failure).
@item void *mmalloc (void *@var{md}, size_t @var{size});
Given an @code{mmalloc} descriptor @var{md}, allocate additional memory of
@var{size} bytes in the associated mapped region.
@item *mrealloc (void *@var{md}, void *@var{ptr}, size_t @var{size});
Given an @code{mmalloc} descriptor @var{md} and a pointer to memory
previously allocated by @code{mmalloc} in @var{ptr}, reallocate the
memory to be @var{size} bytes long, possibly moving the existing
contents of memory if necessary.
@item void *mvalloc (void *@var{md}, size_t @var{size});
Like @code{mmalloc} but the resulting memory is aligned on a page boundary.
@item void mfree (void *@var{md}, void *@var{ptr});
Given an @code{mmalloc} descriptor @var{md} and a pointer to memory previously
allocated by @code{mmalloc} in @var{ptr}, free the previously allocated memory.
@item int mmalloc_errno (void *@var{md});
Given a @code{mmalloc} descriptor, if the last @code{mmalloc} operation
failed for some reason due to a system call failure, then
returns the associated @code{errno}. Returns 0 otherwise.
@end table
@bye
|