I was trying to understand the difference between a task_struct's mm and active_mm fields, and came across a 20-year old email from Linus Torvalds which references the notion of "anonymous processes":
- we have "real address spaces" and "anonymous address spaces". The
difference is that an anonymous address space doesn't care about the
user-level page tables at all, so when we do a context switch into an
anonymous address space we just leave the previous address space
active.
[...]
- "tsk->mm" points to the "real address space". For an **anonymous process**,
tsk->mm will be NULL, for the logical reason that an **anonymous process**
really doesn't _have_ a real address space at all.
- however, we obviously need to keep track of which address space we
"stole" for such an anonymous user. For that, we have "tsk->active_mm",
which shows what the currently active address space is.
The rule is that for a process with a real address space (ie tsk->mm is
non-NULL) the active_mm obviously always has to be the same as the real
one.
For a **anonymous process**, tsk->mm == NULL, and tsk->active_mm is the
"borrowed" mm while the **anonymous process** is running. When the
**anonymous process** gets scheduled away, the borrowed address space is
returned and cleared.