What data structures use 128MB of 1GB Linux kernel space?
===

In almost all books and articles I have read about about HIGHMEM in Linux kernel, they say while using 3:1 split, not all of the 1GB is available to the kernel for mapping. And normally its 896MB or so, with the rest being used for kernel data structures, memory maps, page tables and such.

My question is, what exactly are these data structures? Page tables are normally accessed via a page table address register, right? And the base address of page table is normally stored as a physical address. Now why do one need to *reserve* a virtual address space for the entire table?

Similarly, I read about kernel code itself occupying space. What does that have to do with virtual address space? Is it not the physical memory that would be consumed for storing the code?

And finally, these data structures why do they have to reserve the 128MB space? Why can't they be used out of the entire 1GB address space, as required, like any other normal data structure in kernel would do?

I have gone through LDD3, Professional Linux Kernel Architecture and several posts here at stack-overflow (like: http://stackoverflow.com/questions/8252785/why-linux-kernel-zone-normal-is-limited-to-896-mb) and an older LWN [article][1], but found no specific information on the same.


  [1]: http://lwn.net/Articles/75174/