I'm having an incredibly tough time making sense of this excerpt from the Linux device drivers book (sorry for text-heavy post):
The kernel (on the x86 architecture, in the default configuration) splits the 4-GB virtual address space between user-space and the kernel; the same set of mappings is used in both contexts. A typical split dedicates 3 GB to user space, and 1 GB for kernelspace.
Ok, got it.
The kernel’s code and data structures must fit into that space, but the biggest consumer of kernel address space is virtual mappings for physical memory.
What does this mean? Aren't the kernel's code and data structures also in "virtual memory that's mapped to physical address space." Otherwise where are these code and data structures even stored?
Or is this saying that the kernel needs virtual address space to map random non-kernel related data that it's operating on via drivers, IPC or whatever?
The kernel cannot directly manipulate memory that is not mapped into the kernel’s address space. The kernel, in other words, needs its own virtual address for any memory it must touch directly.
Is this even true? If the kernel is running in the context of a process (handling a syscall), the process' page tables will still be loaded, so why can't the kernel read usermode process memory directly?
Thus, for many years, the maximum amount of physical memory that could be handled by the kernel was the amount that could be mapped into the kernel’s portion of the virtual address space, minus the space needed for the kernel code itself.
Ok, if my understanding in quote #2 is correct, this makes sense.
As a result, x86-based Linux systems could work with a maximum of a little under 1 GB of physical memory.
???? This seems like a complete non sequitur. Why can't it work with 4GB of memory and just map different stuff into the 1GB space available for the kernel as needed? How does the kernel space only being ~1GB mean the system can't run with 4GB? It doesn't have to all be mapped at once.