[Overview][Constants][Types][Procedures and functions][Variables][Index] Reference for unit 'oldlinux' (#rtl)

MMap

Create memory map of a file

Declaration

Source position: oldlinux.pp line 1545

function MMap(

  const m: tmmapargs

):LongInt;

Description

MMap maps or unmaps files or devices into memory. The different fields of the argument m determine what and how the mmap maps this:

address
Address where to mmap the device. This address is a hint, and may not be followed.
size
Size (in bytes) of area to be mapped.
prot

Protection of mapped memory. This is a OR-ed combination of the following constants:

PROT_EXEC
The memory can be executed.
PROT_READ
The memory can be read.
PROT_WRITE
The memory can be written.
PROT_NONE
The memory can not be accessed.
flags

Contains some options for the mmap call. It is an OR-ed combination of the following constants:

MAP_FIXED
Do not map at another address than the given address. If the address cannot be used, MMap will fail.
MAP_SHARED
Share this map with other processes that map this object.
MAP_PRIVATE
Create a private map with copy-on-write semantics.
MAP_ANONYMOUS
fd does not have to be a file descriptor.

One of the options MAP_SHARED and MAP_PRIVATE must be present, but not both at the same time.

fd
File descriptor from which to map.
offset
Offset to be used in file descriptor fd.

The function returns a pointer to the mapped memory, or a -1 in case of en error.

Errors

On error, -1 is returned and LinuxError is set to the error code:

Sys_EBADF
fd is not a valid file descriptor and MAP_ANONYMOUS was not specified.
Sys_EACCES
MAP_PRIVATE was specified, but fd is not open for reading. Or MAP_SHARED was asked and PROT_WRITE is set, fd is not open for writing
Sys_EINVAL
One of the record fields Start, length or offset is invalid.
Sys_ETXTBUSY
MAP_DENYWRITE was set but the object specified by fd is open for writing.
Sys_EAGAIN
fd is locked, or too much memory is locked.
Sys_ENOMEM
Not enough memory for this operation.

See also

MUnMap

  

Unmap previously mapped memory block

Example

Program Example66;

{ Program to demonstrate the MMap function. }

Uses oldlinux;

Var S : String;
    fd,Len : Longint;
    args : tmmapargs;
    P : PChar;

begin
  S:='This is a string'#0;
  Len:=Length(S);
  fd:=fdOpen('testfile.txt',Open_wrOnly or open_creat);
  If fd=-1 then
    Halt(1);
  If fdWrite(fd,S[1],Len)=-1 then
    Halt(2);
  fdClose(fd);
  fdOpen('testfile.txt',Open_rdOnly);
  if fd=-1 then
    Halt(3);
  args.address:=0;
  args.offset:=0;
  args.size:=Len+1;
  args.fd:=Fd;
  args.flags:=MAP_PRIVATE;
  args.prot:=PROT_READ or PROT_WRITE;
  P:=Pchar(mmap(args));
  If longint(P)=-1 then
    Halt(4);
  Writeln('Read in memory  :',P);
  fdclose(fd);
  if Not MUnMap(P,Len) Then
    Halt(LinuxError);
end.
The latest version of this document can be found at lazarus-ccr.sourceforge.net.