           GNU libsigsegv  -  Handling page faults in user mode

This is a library for handling page faults in user mode. A page fault
occurs when a program tries to access to a region of memory that is
currently not available. Catching and handling a page fault is a useful
technique for implementing:

  - pageable virtual memory,
  - memory-mapped access to persistent databases,
  - generational garbage collectors,
  - stack overflow handlers,
  - distributed shared memory,
  - ...

This library supports three sets of functions, all defined in <sigsegv.h>:

  - Global SIGSEGV handlers:
    sigsegv_install_handler, sigsegv_deinstall_handler.

  - Local SIGSEGV handlers (a handler per memory area):
    sigsegv_init, sigsegv_register, sigsegv_unregister, sigsegv_dispatch.

  - Stack overflow handlers:
    stackoverflow_install_handler, stackoverflow_deinstall_handler.

Each of the three APIs can be used independently or simultaneously.
For examples of the use of the APIs, see:

  - Global SIGSEGV handlers: see tests/sigsegv1.c.
  - Local SIGSEGV handlers: see tests/sigsegv2.c.
  - Stack overflow handlers: see tests/stackoverflow1.c.


About portability.

Some platforms don't support this functionality. In <sigsegv.h>, the
preprocessor macro HAVE_SIGSEGV_RECOVERY will be defined if global and
local SIGSEGV handlers are available, and the preprocessor macro
HAVE_STACK_OVERFLOW_RECOVERY will be defined if stack overflow handlers
are available. Note that the declared functions are available in all cases;
on platforms where HAVE_SIGSEGV_RECOVERY or HAVE_STACK_OVERFLOW_RECOVERY is
not defined, they will simply always return an error code or do nothing.

The list of platforms where this library is known to work is contained in
the file PORTING.


About pageable virtual memory.

Pageable virtual memory is usually done in the operating system's kernel.
This library helps in implementing the others.

Installing a page fault handler is usually more efficient than doing
access checks in software at every access, because it's effectively the
hardware (the MMU) which checks whether a page is present or not.

Note that if you use system calls (like read()) to write into write-
protected pages, the system will react by returning -1 and setting
errno to EFAULT, instead of signalling SIGSEGV and restarting the system
call. In this case, the program has to do what the SIGSEGV handler would
do, and then restart the read() operation. Some buggy systems (SunOS 4)
go into an endless loop on this occasion; on these systems you have to
make sure that an area is writable _before_ you call read() on it,


About stack overflow handlers.

In some applications, the stack overflow handler performs some cleanup or
notifies the user and then immediately terminates the application.  In
other applications, the stack overflow handler longjmps back to a central
point in the application.  This library supports both uses.  In the second
case, the handler must ensure to restore the normal signal mask (because
many signals are blocked while the handler is executed), and must also
call sigsegv_leave_handler(); then only it can longjmp away.


About shared libraries.

This library builds as a static library by default.  This seems useful
because of the small size of the library (4 KB).  Of course, you can build
it as a shared library by specifying the configure option '--enable-shared'.


Installation instructions on Unix:

        ./configure
        make
        make check
        make install

Installation instructions on Woe32:

        See README.woe32.

Copyright notice:

Copyright 1998-1999, 2002-2003  Bruno Haible <bruno@clisp.org>
Copyright 2002-2003  Paolo Bonzini <bonzini@gnu.org>

This is free software distributed under the GNU General Public Licence
described in the file COPYING. There is ABSOLUTELY NO WARRANTY, explicit or
implied, on this software.


Distribution:

ftp://ftp.gnu.org/pub/gnu/libsigsegv/libsigsegv-2.1.tar.gz
http://ftp.gnu.org/gnu/libsigsegv/libsigsegv-2.1.tar.gz

Homepage:

http://libsigsegv.sourceforge.net/
