In the previous example, the shared UML would contain only what's needed to run a filesystem. This includes the filesystem, block layer, a block driver, and whatever kernel infrastructure they need.
Another example would be a shared network interface. This would contain the network stack, a network driver, and kernel infrastructure.
The needed infrastructure would include stuff like memory allocation and management. Anything that used the page or buffer caches, or any other caches, would need their own private versions of those.
An interesting problem is that a process in one UML would need to be able to wake up a process in another UML. This would require a mechanism for cross-UML process wakeups.