On restart, Condor must restore all segments in the checkpoint file. The data segment is restored as in static checkpointing. Condor restores the stack segment last, and returns to the top of the stack as if returning from a signal handler.
To restore the dynamic libraries, Condor first uses the mmap()
function to allocate the necessary mapped segment in the virtual
address space. This call maps the file /dev/zero from
the appropriate start address to end address, to provide an
initialized segment. The protection and attribute flags for this new
segment are set to be those saved in the checkpoint file, except that
the segment always has write access enabled and the memory is always
marked as private. Write access is necessary so that the saved bytes
in the checkpoint file can be written to the segment. The memory is
not shared to ensure that our (possibly different) version of a system
library does not interfere with other processes on the machine. Once
the mapped segment is allocated, the read() system call is used
to overwrite the memory with the saved bytes in the checkpoint file.
Note that the definitions for mmap() and write() must be forced to be static. Otherwise, we run into the possibility of overwriting the shared library text segment in which they are defined while we are in a call to either mmap() or write(), which can have disastrous consequences.