[PATCH v2 10/10] Documentation: um: document nommu UML
Hajime Tazaki
thehajime at gmail.com
Thu Jul 23 23:20:02 PDT 2026
On Thu, 23 Jul 2026 18:35:51 +0900,
Johannes Berg wrote:
> +When emulating a system with an MMU, UML gives every ``mm_struct`` its own
> +host process with its own host address space, and keeps that address space
> +in sync with the kernel's page tables by issuing ``mmap()``/``munmap()``
> +into it.
> +
> +NOMMU has no per-process address spaces: there is a single "physical" address
> +space that the kernel and every userspace process share. UML models this with
> +a **userspace runner** - an ordinary uml-userspace stub host process, started
> +exactly like an MMU userspace process, but with the whole of "physical" memory
> +(the physmem file) mapped into it at the kernel's addresses:
> +
> +- The runner ``exec()``'s the stub just like the MMU case. The only extra step
> + is that, once it is up, the kernel maps the entire physmem file into it in one
> + go, at the same addresses the kernel uses.
> +- Because NOMMU never remaps, that single mapping is all a runner ever needs:
I was actually not sure what you mean here: "NOMMU never remaps".
could you care to elaborate ?
the subsequent parts are clear to me.
> + there is no per-mm host process, no TLB sync and no ``mmap()`` of individual
> + page-table entries into a child. Userspace code and data - placed in memory
> + by the loader - are directly executable and accessible.
> +- The runner processes hold no per-task state: the kernel loads a task's state
> + on every entry, so there's just one process per CPU.
> +
> +Running a task's userspace therefore only means pointing a runner at that
> +task's code and letting it run until the next syscall or signal
> +
> +Building and running
> +====================
> +
> +Configure and build the ARCH=um kernel normally, but deselect CONFIG_MMU.
> +
> +KUnit tests can be run in NOMMU mode with::
> +
> + ./tools/testing/kunit/kunit.py run \
> + --kconfig_add CONFIG_MMU=n --kconfig_add CONFIG_KUNIT_UML_PCI=n
> +
> +Running a normal userspace requires NOMMU-aware binaries. There is no stock
> +x86_64 NOMMU distribution, but a prebuilt Alpine image with musl-libc and
> +busybox built for NOMMU is available and can be turned into a root image::
> +
> + cid=$(docker create ghcr.io/thehajime/alpine:3.20.3-um-nommu)
> + docker export "$cid" > alpine.tar
> + docker rm "$cid"
> + mkdir alpine-root && tar xf alpine.tar -C alpine-root
> + mke2fs -q -F -t ext4 -d alpine-root alpine.ext4 1200M
> +
> +Then boot it::
> +
> + ./linux ubd0=./alpine.ext4 root=/dev/ubda rw mem=1024m init=/sbin/init
For the alpine packages, I'll contact the distribution once this UML
is upstreamed. And update this part with more proper information
rather than my personal repository.
-- Hajime
More information about the linux-um
mailing list