Memory faults are implemented with SIGSEGV. When a UML process makes an invalid memory access, the host will generate a SIGSEGV for it. The kernel SIGSEGV handler figures out whether the access is legitimate and it faulted only because that page had not yet been mapped into the process or whether it is just an illegal access. The first case is handled by calling the generic page fault handler and mapping the new page into the process. If the access was illegal, then a SIGSEGV is queued to the process, and it will either die or handle the signal when it tries to return to userspace.