UML is a port of Linux to itself. That is, it treats Linux as a platform to which the kernel can be ported, like platforms such as Intel and Alpha. The architecture-dependent code which comprises UML implements all of the low-level hardware support that the generic kernel needs in terms of Linux system calls. It is implemented using only system calls - there are no special patches or hooks needed in the host kernel.
It runs the same userspace as the host kernel, and is able to run almost same range of applications - the exceptions are a few highly non-portable things such as
Processes running inside UML have no access to host resources that were not explicitly provided to the virtual machine.