Museum

Home

Lab Overview

Retrotechnology Articles

Online Manuals

⇒ mmap(2) — Atari System V ue12

Media Vault

Software Library

Restoration Projects

Artifacts Sought

Related Articles

fcntl(2)

fork(2)

mprotect(2)

munmap(2)

plock(2)

sysconf(2,)

lockf(3C)

mlockall(3C)





   mmap(2)                                                             mmap(2)


   NAME
         mmap - map pages of memory

   SYNOPSIS
         #include <sys/types.h>
         #include <sys/mman.h>

         caddrt mmap(caddrt addr, sizet len, int prot, int flags, int fd,
               offt off);

   DESCRIPTION
         The function mmap establishes a mapping between a process's address
         space and a virtual memory object.  The format of the call is as
         follows:

               pa = mmap(addr, len, prot, flags, fd, off);

         mmap establishes a mapping between the process's address space at an
         address pa for len bytes to the memory object represented by the file
         descriptor fd at offset off for len bytes.  The value of pa is an
         implementation-dependent function of the parameter addr and values of
         flags, further described below.  A successful mmap call returns pa as
         its result.  The address ranges covered by [pa, pa + len) and [off,
         off + len) must be legitimate for the possible (not necessarily
         current) address space of a process and the object in question,
         respectively.  mmap cannot grow a file.

         The mapping established by mmap replaces any previous mappings for
         the process's pages in the range [pa, pa + len).

         The parameter prot determines whether read, write, execute, or some
         combination of accesses are permitted to the pages being mapped. The
         protection options are defined in <sys/mman.h> as:
               PROTREAD                Page can be read.
               PROTWRITE               Page can be written.
               PROTEXEC                Page can be executed.
               PROTNONE                Page can not be accessed.

         Not all implementations literally provide all possible combinations.
         PROTWRITE is often implemented as PROTREAD|PROTWRITE and PROTEXEC
         as PROTREAD|PROTEXEC.  However, no implementation will permit a
         write to succeed where PROTWRITE has not been set.  The behavior of
         PROTWRITE can be influenced by setting MAPPRIVATE in the flags
         parameter, described below.

         The parameter flags provides other information about the handling of
         the mapped pages.  The options are defined in <sys/mman.h> as:

               MAPSHARED               Share changes.
               MAPPRIVATE              Changes are private.
               MAPFIXED                Interpret addr exactly.


   7/91                                                                 Page 1









   mmap(2)                                                             mmap(2)


         MAPSHARED and MAPPRIVATE describe the disposition of write
         references to the memory object.  If MAPSHARED is specified, write
         references will change the memory object.  If MAPPRIVATE is
         specified, the initial write reference will create a private copy of
         the memory object page and redirect the mapping to the copy. Either
         MAPSHARED or MAPPRIVATE must be specified, but not both.  The
         mapping type is retained across a fork(2).

         Note that the private copy is not created until the first write;
         until then, other users who have the object mapped MAPSHARED can
         change the object.

         MAPFIXED informs the system that the value of pa must be addr,
         exactly.  The use of MAPFIXED is discouraged, as it may prevent an
         implementation from making the most effective use of system
         resources.

         When MAPFIXED is not set, the system uses addr in an
         implementation-defined manner to arrive at pa.  The pa so chosen will
         be an area of the address space which the system deems suitable for a
         mapping of len bytes to the specified object.  All implementations
         interpret an addr value of zero as granting the system complete
         freedom in selecting pa, subject to constraints described below.  A
         non-zero value of addr is taken to be a suggestion of a process
         address near which the mapping should be placed.  When the system
         selects a value for pa, it will never place a mapping at address 0,
         nor will it replace any extant mapping, nor map into areas considered
         part of the potential data or stack segments.

         The parameter off is constrained to be aligned and sized according to
         the value returned by sysconf.  When MAPFIXED is specified, the
         parameter addr must also meet these constraints.  The system performs
         mapping operations over whole pages.  Thus, while the parameter len
         need not meet a size or alignment constraint, the system will
         include, in any mapping operation, any partial page specified by the
         range [pa, pa + len).

         The system will always zero-fill any partial page at the end of an
         object.  Further, the system will never write out any modified
         portions of the last page of an object which are beyond its end.
         References to whole pages following the end of an object will result
         in the delivery of a SIGBUS signal.  SIGBUS signals may also be
         delivered on various file system conditions, including quota exceeded
         errors.

   RETURN VALUE
         On success, mmap returns the address at which the mapping was placed
         (pa).  On failure it returns (caddrt)-1 and sets errno to indicate
         an error.




   Page 2                                                                 7/91









   mmap(2)                                                             mmap(2)


   ERRORS
         Under the following conditions, mmap fails and sets errno to:

        EAGAIN The mapping could not be locked in memory.

        EBADF  fd is not open.

        EACCES fd is not open for read, regardless of the protection
                specified, or fd is not open for write and PROTWRITE was
                specified for a MAPSHARED type mapping.

        ENXIO  Addresses in the range [off, off + len) are invalid for fd.

        EINVAL The arguments addr (if MAPFIXED was specified) or off are not
                multiples of the page size as returned by sysconf.

        EINVAL The field in flags is invalid (neither MAPPRIVATE or
                MAPSHARED).

        EINVAL The argument len has a value less than or equal to 0.

        ENODEV fd refers to an object for which mmap is meaningless, such as a
                terminal.

        ENOMEM MAPFIXED was specified and the range [addr, addr + len)
                exceeds that allowed for the address space of a process, or
                MAPFIXED was not specified and there is insufficient room in
                the address space to effect the mapping.

   NOTES
         mmap allows access to resources via address space manipulations
         instead of the read/write interface.  Once a file is mapped, all a
         process has to do to access it is use the data at the address to
         which the object was mapped.  Consider the following pseudo-code:

               fd = open(...)
               lseek(fd, offset)
               read(fd, buf, len)
               /* use data in buf */

         Here is a rewrite using mmap:

               fd = open(...)
               address = mmap((caddrt) 0, len, (PROTREAD | PROTWRITE),
                              MAPPRIVATE, fd, offset)
               /* use data at address */

   SEE ALSO
         fcntl(2), fork(2), mprotect(2), munmap(2), plock(2), sysconf(2,)
         lockf(3C), mlockall(3C).



   7/91                                                                 Page 3





Typewritten Software • bear@typewritten.org • Edmonds, WA 98026