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

installation procedures which aggressively probe for hardware using
privileged instructions

emulators such as dosemu, wine, and plex86

Userspace code runs natively on the processor without any sort of
instruction emulation.

Processes running inside UML have no access to host resources that
were not explicitly provided to the virtual machine.