📄 mmalloc.texi
字号:
\input texinfo @c -*- Texinfo -*-@setfilename mmalloc.info@ifinfo@formatSTART-INFO-DIR-ENTRY* Mmalloc: (mmalloc). The GNU mapped-malloc package.END-INFO-DIR-ENTRY@end formatThis file documents the GNU mmalloc (mapped-malloc) package, written byfnf@@cygnus.com, based on GNU malloc written by mike@ai.mit.edu.Copyright (C) 1992 Free Software Foundation, Inc.Permission is granted to make and distribute verbatim copies ofthis manual provided the copyright notice and this permission noticeare preserved on all copies.@ignorePermission is granted to process this file through Tex and print theresults, provided the printed document carries copying permissionnotice identical to this one except for the removal of this paragraph(this paragraph not being relevant to the printed manual).@end ignorePermission is granted to copy and distribute modified versions of thismanual under the conditions for verbatim copying, provided also that theentire resulting derived work is distributed under the terms of apermission notice identical to this one.Permission is granted to copy and distribute translations of this manualinto 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@author Mike Haertel@author Free Software Foundation@page@tex\def\$#1${{#1}} % Kluge: collect RCS revision info without $...$\xdef\manvers{\$Revision: 1.2 $} % 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 1filllCopyright @copyright{} 1992 Free Software Foundation, Inc.Permission is granted to make and distribute verbatim copies ofthis manual provided the copyright notice and this permission noticeare preserved on all copies.Permission is granted to copy and distribute modified versions of thismanual under the conditions for verbatim copying, provided also thatthe entire resulting derived work is distributed under the terms of apermission notice identical to this one.Permission is granted to copy and distribute translations of this manualinto another language, under the above conditions for modified versions.@end titlepage@end iftex@ifinfo@node Top, Overview, (dir), (dir)@top mmallocThis 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 DescriptionThis is a heavily modified version of GNU @code{malloc}. It uses@code{mmap} as the basic mechanism for for obtaining memory from thesystem, rather than @code{sbrk}. This gives it several advantages over themore traditional malloc:@itemize @bullet@itemSeveral different heaps can be used, each of them growingor shinking under control of @code{mmap}, with the @code{mmalloc} functionsusing a specific heap on a call by call basis.@itemBy using @code{mmap}, it is easy to create heaps which are intended tobe persistent and exist as a filesystem object after the creatingprocess has gone away.@itemBecause multiple heaps can be managed, data used for a specific purpose can be allocated into its own heap, makingit easier to allow applications to ``dump'' and ``restore'' initializedmalloc-managed memory regions. For example, the ``unexec'' hack popularizedby GNU Emacs could potentially go away.@end itemize@node Implementation, , Overview, Top@chapter ImplementationThe @code{mmalloc} functions contain no internal static state. All@code{mmalloc} internal data is allocated in the mapped in region, alongwith the user data that it manages. This allows it to manage multiplesuch regions and to ``pick up where it left off'' when such regions arelater dynamically mapped back in.In some sense, malloc has been ``purified'' to contain no internal stateinformation and generalized to use multiple memory regions rather than asingle region managed by @code{sbrk}. However the new routines now need anextra parameter which informs @code{mmalloc} which memory region it is dealingwith (along with other information). This parameter is called the@dfn{malloc descriptor}.The functions initially provided by @code{mmalloc} are:@examplevoid *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 CompatibilityTo 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 thatexpect malloc descriptors are called with a @code{NULL} pointer rather than avalid malloc descriptor, then they default to using an @code{sbrk} managedregion.The @code{mmalloc} package provides compatible @code{malloc}, @code{realloc},and @code{free} functions using this mechanism internally.Applications can avoid this extra interface layer by simply including thefollowing defines:@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@noindentor replace the existing @code{malloc}, @code{realloc}, and @code{free}calls with the above patterns if using @code{#define} causes problems.@node Functions, , Compatibility, Implementation@section Function DescriptionsThese 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 iscompatible with the current @code{mmalloc} package, then its data ismapped in and is immediately accessible at the same addresses inthe current process as the process that created the file.If @var{baseaddr} is not @code{NULL}, the mapping is establishedstarting at the specified address in the process address space. If@var{baseaddr} is @code{NULL}, the @code{mmalloc} package chooses asuitable address at which to start the mapped region, which will be thevalue of the previous mapping if opening an existing file which waspreviously built by @code{mmalloc}, or for new files will be a valuechosen by @code{mmap}.Specifying @var{baseaddr} provides more control over where the regionsstart and how big they can be before bumping into existing mappedregions or future mapped regions.On success, returns a malloc descriptor which is used in subsequentcalls 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 theactual implementation details.On failure returns @code{NULL}.@item void *mmalloc_detach (void *@var{md});Terminate access to a @code{mmalloc} managed region identified by thedescriptor @var{md}, by closing the base file and unmapping all memorypages associated with the region. Returns @code{NULL} on success.Returns the malloc descriptor on failure, which can subsequentlybe used for further action (such as obtaining more information aboutthe 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 memorypreviously allocated by @code{mmalloc} in @var{ptr}, reallocate thememory to be @var{size} bytes long, possibly moving the existingcontents 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 previouslyallocated 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} operationfailed for some reason due to a system call failure, thenreturns the associated @code{errno}. Returns 0 otherwise.(This function is not yet implemented).@end table@bye
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -