HPUX mmap[2]






 mmap(2)                                                             mmap(2)





 NAME
      mmap - map object into virtual memory

 SYNOPSIS
      #include <sys/mman.h>

      caddr_t mmap(
           caddr_t addr,
           size_t len,
           int prot,
           int flags,
           int fildes,
           off_t off);

 DESCRIPTION
      mmap() creates a new memory mapped file or anonymous memory region.
      The format of the call is as follows:

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

      mmap() establishes a mapping between the process's address space at an
      address pa for len bytes to an object represented by the file
      descriptor fildes at offset off for len bytes, or to an anonymous
      region of physical memory of size len bytes.  A successful mmap() call
      returns pa as its result, where pa is an implementation-dependent
      function of the requested starting address and length for the new
      region, addr and len, as further described below.

      If len is not a multiple of the page size returned by
      sysconf(_SC_PAGE_SIZE), then references are permitted to an address
      between pa+len and the next higher address that is an integer multiple
      of the page size; however, the results of any such references are
      undefined.

      The flags argument specifies the attributes of the region.  Values of
      the flags argument are constructed by bitwise-inclusive ORing flags
      from the following list of symbolic names defined in <sys/mman.h>:

           MAP_FILE            Create a mapped file region.

           MAP_ANONYMOUS       Create an unnamed memory region.

           MAP_VARIABLE        Place region at implementation-computed
                               address.

           MAP_FIXED           Place region at specified address.

           MAP_SHARED          Share changes between processes and
                               underlying file object, if any.





 Hewlett-Packard Company            - 1 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





           MAP_PRIVATE         Changes are private to a process.

      The MAP_FILE and MAP_ANONYMOUS flags control whether the region to be
      mapped is a mapped file region or an anonymous shared memory region.
      Exactly one of these flags must be selected.

      If MAP_FILE is set in flags:

           o    A new mapped file region is created, mapping the file
                associated with fildes.

           o    off specifies the file byte offset at which the mapping
                starts.  This offset must be a multiple of the page size
                returned by sysconf(_SC_PAGE_SIZE).

           o    If the end of the mapped file region is beyond the end of
                the file, any reference to an address in the mapped file
                region corresponding to an offset beyond the end of the file
                results in the delivery of a SIGBUS signal to the process,
                unless the address lies in the last partial page
                corresponding to the range beyond the end of the file.  The
                last partial page mapping the range beyond the end of the
                file is always initialized to zeros, and any modified
                portions of the last page of a file which are beyond its end
                are not written back to the file.

      If MAP_ANONYMOUS is set in flags:

           o    A new memory region is created and initialized to all zeros.
                This memory region can be shared only with descendants of
                the current process.

           o    If the fildes argument is not -1, an EINVAL error is
                generated.

           o    The value of off is meaningless because there is no
                underlying file object for the memory region.

      The MAP_VARIABLE and MAP_FIXED flags control the placement of the
      region as described below.  Exactly one of these flags must be
      selected.

      If MAP_VARIABLE is set in flags:

           o    If the requested address is NULL, or if it is not possible
                for the system to place the region at the requested address,
                the region is placed at an address selected by the system.
                If the requested address is not a multiple of the page size
                returned by sysconf(_SC_PAGE_SIZE), the system treats the
                address as if it were rounded up to the next larger page
                size multiple.



 Hewlett-Packard Company            - 2 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





      If MAP_FIXED is set in flags:

           o    If it is not possible for the system to place the region at
                the requested address, the mmap() function fails.

           o    addr must be a multiple of the page size returned by
                sysconf(_SC_PAGE_SIZE).

      A region is never placed at an address where it would overlap with an
      existing region or a portion of the process address space that is
      already in use or reserved for other purposes.  A region is always
      placed at a starting address that is an exact multiple of the page
      size returned by sysconf(_SC_PAGE_SIZE).

      The MAP_PRIVATE and MAP_SHARED flags control the visibility of
      modifications to the mapped file or anonymous memory region.  Exactly
      one of these flags must be selected.

      If MAP_SHARED is set in flags:

           o    Modifications to the region are visible to other processes
                which have mapped the same file using MAP_SHARED.

           o    If the region is a mapped file region, modifications to the
                region are written to the underlying file.

      If MAP_PRIVATE is set in flags:

           o    Modification to the mapped region by the calling process is
                not visible to other processes which have mapped the same
                region using either MAP_PRIVATE or MAP_SHARED.
                Modifications are not visible to descendant processes that
                have inherited the mapped region across a fork().

           o    If the region is a mapped file region, modifications to to
                the region are not written to the underlying file.

      It is unspecified whether modifications by processes that have mapped
      a file using MAP_SHARED are visible to other processes that have
      mapped the same file using MAP_PRIVATE.

      The prot argument specifies the mapped region's access permissions.
      Header file <sys/mman.h> defines the following access permissions:

           PROT_READ      Region can be read
           PROT_WRITE     Region can be written
           PROT_EXEC      Region can be executed
           PROT_NONE      Region cannot be accessed

      The prot argument can be PROT_NONE, or any combination of PROT_READ,
      PROT_WRITE , and PROT_EXEC OR-ed together.  If PROT_NONE is not



 Hewlett-Packard Company            - 3 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





      specified, the system may grant other access permissions to the region
      in addition to those explicitly requested, except that write access
      will not be granted unless PROT_WRITE is specified.

      mmap() cannot create a mapped file region unless the file descriptor
      used to map the file is open for reading.  For a mapped file region
      that is mapped with MAP_SHARED, mmap() grants write access permission
      only if the file descriptor is open for writing.  If a region was
      mapped with either MAP_PRIVATE or MAP_ANONYMOUS, mmap() grants all
      requested access permissions.

      After the successful completion of mmap(), fildes can be closed
      without effect on the mapped region or on the contents of the mapped
      file.  Each mapped region creates a file reference, similar to an open
      file descriptor, that prevents the file data from being deallocated.

      Whether modifications made to the file using write() are visible to
      mapped regions, and whether modification to a mapped region are
      visible with read(), is undefined except for the effect of msync().

      If an enforcement-mode file lock is in effect for any range of a file,
      a call to mmap() to map any range of the file with access rights that
      would violate the lock fails.  The msem_lock() and msem_unlock()
      semaphore interfaces can be used to coordinate shared access to a
      region created with the MAP_SHARED flag.  The advisory locks of the
      lockf() or fcntl() interfaces have no effect on memory mapped access,
      but they can be used to coordinate shared access to a MAP_SHARED
      mapped file region.

      For a memory mapped file, the st_atime and st_mtime values returned by
      stat() are updated when a page in the memory mapped region is read
      from or written to the file system.

      After a call to fork(), the child process inherits all mapped regions
      with the same data and the same sharing and protection attributes as
      in the parent process.  Each mapped file and anonymous memory region
      created with mmap() is unmapped upon process exit, and by a successful
      call to any of the exec functions.

      A SIGBUS signal is delivered to a process when a write reference to a
      mapped file region would cause a file system error condition such as
      exceeding quota or file system space limits.

      A SIGBUS signal is delivered to a process upon a write reference to a
      region without PROT_WRITE protection, or any reference to a region
      with PROT_NONE protection.

      A call to mmap() with PROT_EXECUTE specified, but without PROT_WRITE
      specified for a MAP_SHARED|MAP_FILE mapping is treated by the system
      as the execution of the underlying file.  This implies that such a
      call fails if the file is currently open for writing or mapped with



 Hewlett-Packard Company            - 4 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





      MAP_SHARED|PROT_WRITE options by any process, and that if the call
      succeeds, the file cannot be opened for writing or subsequently mapped
      with MAP_SHARED|PROT_WRITE options as long as such mappings are
      present.  A file's status as an active executable file is determined
      only at the time of an exec(), exit(), or mmap() operation.
      mprotect() operations on a MAP_FILE|MAP_SHARED mapping have no effect
      on the underlying file's status as an active executable file.

 IMPLEMENTATION NOTES
      Only regular files (not directories, named pipes, or device special
      files) can be mapped.

      System swap resources are reserved for all mappings created with
      either MAP_PRIVATE or MAP_ANONYMOUS.

 RETURN VALUE
      Upon successful completion, mmap() returns the address at which the
      mapping was placed.  Otherwise, mmap() returns -1 and sets errno to
      indicate the error.

 ERRORS
      mmap() fails if any of the following conditions are encountered:

           [EACCESS]      The file referred to by fildes is not open for
                          read access, or the file is not open for write
                          access and PROT_WRITE was set for a MAP_SHARED
                          mapping operation, or PROT_EXECUTE was set for a
                          MAP_SHARED mapping operation and the underlying
                          file does not have execute permission.

           [EBADF]        fildes is not a valid file descriptor.

           [EINVAL]       flags or prot is invalid, or addr (with MAP_FIXED
                          set) or off (with MAP_FILE set) is not a multiple
                          of the page size returned by
                          sysconf(_SC_PAGE_SIZE).

           [ENODEV]       fildes refers to an object that cannot be mapped,
                          such as a terminal.

           [ENOMEM]       There is not enough address space to map len
                          bytes, or MAP_FIXED was set and part of the
                          address space range [addr, addr+len)  (from, and
                          including, addr to, but not including, addr+len)
                          is not available for use.

           [ENXIO]        The addresses specified by the range [off,
                          off+len)  (from, and including, off to, but not
                          including, off+len) are invalid for fildes.





 Hewlett-Packard Company            - 5 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





           [EAGAIN]       The file represented by fildes has enforcement-
                          mode file locking in effect for some range in the
                          file.  (see lockf(2), or fcntl(2)).

           [ETXTBSY]      MAP_SHARED and MAP_FILE are set, and PROT_EXECUTE
                          is set and PROT_WRITE is not set, and the file
                          being mapped is currently open for writing.

 DEPENDENCIES
    Series 700/800
      Because the PA-RISC memory architecture utilizes a globally shared
      virtual address space between processes, and discourages multiple
      virtual address translations to the same physical address, all
      concurrently existing MAP_SHARED mappings of a file range must share
      the same virtual address offsets and hardware translations.  PA-RISC
      -based HP-UX systems allocate virtual address ranges for shared memory
      and shared mapped files in the range 0x80000000 through 0xefffffff.
      This address range is used globally for all memory objects shared
      between processes.

      This implies the following:

           o    Any single range of a file cannot be mapped multiply into
                different virtual address ranges.

           o    After the initial MAP_SHARED mmap() of a file range, all
                subsequent MAP_SHARED calls to mmap() to map the same range
                of a file must either specify MAP_VARIABLE in flags and
                inherit the virtual address range the system has chosen for
                this range, or specify MAP_FIXED with an addr that
                corresponds exactly to the address chosen by the system for
                the initial mapping.  Only after all mappings for a file
                range have been destroyed can that range be mapped to a
                different virtual address.

           o    In most cases, two separate calls to mmap() cannot map
                overlapping ranges in a file.  The virtual address range
                reserved for a file range is determined at the time of the
                initial mapping of the file range into a process address
                space.  The system allocates only the virtual address range
                necessary to represent the initial mapping.  As long as the
                initial mapping exists, subsequent attempts to map a
                different file range that includes any portion of the
                initial range may fail with an ENOMEM error if an extended
                contiguous address range that preserves the mappings of the
                initial range cannot be allocated.

           o    Separate calls to mmap() to map contiguous ranges of a file
                do not necessarily return contiguous virtual address ranges.
                The system may allocate virtual addresses for each call to
                mmap() on a first available basis.



 Hewlett-Packard Company            - 6 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)




           o    The use of MAP_FIXED is strongly discouraged because it is
                not portable.  Using MAP_FIXED is generally unsuccessful on
                this implementation, and when it is successful, it may
                prevent the system from optimally allocating virtual address
                space.

      The following combinations of protection modes are supported:

           PROT_NONE
           PROT_READ
           PROT_READ|PROT_EXECUTE
           PROT_READ|PROT_WRITE
           PROT_READ|PROT_WRITE|PROT_EXECUTE

      If a MAP_PRIVATE mapping is created of a file for which a MAP_SHARED
      mapping exists, a separate copy of a page for the MAP_PRIVATE mapping
      is created at the time of the first access to the page through the
      private mapping.

    Series 300/400
      The following combinations of protection modes are supported:

           PROT_NONE
           PROT_READ
           PROT_READ|PROT_EXECUTE
           PROT_READ|PROT_WRITE
           PROT_READ|PROT_WRITE|PROT_EXECUTE

      In addition, for protection modes that do not explicitly have
      PROT_EXECUTE set, individual pages within the region can be promoted
      to include PROT_EXECUTE permissions simply by executing code located
      within the region.

      If a MAP_PRIVATE mapping is created of a file for which a MAP_SHARED
      mapping exists, a separate copy of a page for the MAP_PRIVATE mapping
      is created at the time of the first write reference to the page
      through the private mapping.

    HP Clustered Environment
      In a clustered environment, modifications to a MAP_SHARED mapped file
      region on one cluster node may not be visible to other processes on
      other cluster nodes that have the same file mapped with the MAP_SHARED
      option.

 AUTHOR
      mmap() was developed by HP, AT&T, and OSF.

 SEE ALSO
      fcntl(2), fork(2), ftruncate(2), lockf(2), madvise(2), mprotect(2),
      msem_init(2), msem_lock(2), msem_unlock(2), msync(2), munmap(2),
      sysconf(2), mman(5), stat(5).



 Hewlett-Packard Company            - 7 -     HP-UX Release 9.0: August 1992






 mmap(2)                                                             mmap(2)





 STANDARDS CONFORMANCE
      mmap(): AES [Series 300/400/700 only]




















































 Hewlett-Packard Company            - 8 -     HP-UX Release 9.0: August 1992