Linux requires access to the platform's physical memory, kernel virtual memory, and a virtual address space for each process. UML implements this by creating a physical memory sized file and mapping it as a block into its address space. This provides the virtual machine's physical memory area.
Kernel and process virtual memory are implemented by mapping individual pages from that file into the appropriate places in the virtual address spaces.
The kernel's text and data are located in the process address space. So, effectively, there are some unusable holes in the process virtual memory area.