Библиотека сайта rus-linux.net
The book is available and called simply "Understanding The Linux Virtual Memory Manager". There is a lot of additional material in the book that is not available here, including details on later 2.4 kernels, introductions to 2.6, a whole new chapter on the shared memory filesystem, coverage of TLB management, a lot more code commentary, countless other additions and clarifications and a CD with lots of cool stuff on it. This material (although now dated and lacking in comparison to the book) will remain available although I obviously encourge you to buy the book from your favourite book store :-) . As the book is under the Bruce Perens Open Book Series, it will be available 90 days after appearing on the book shelves which means it is not available right now. When it is available, it will be downloadable from http://www.phptr.com/perens so check there for more information.
To be fully clear, this webpage is not the actual book.
Next: 5.2 Managing the Address Up: 5. Process Address Space Previous: 5. Process Address Space   Contents   Index
5.1 Linear Address Space
From a user perspective, the address space is a flat linear address space
but predictably, the kernel's perspective is very different. The linear
address space is split into two parts, the userspace part which potentially
changes with each full context switch and the kernel address space which
remains constant. The location of the split is determined by the value of
PAGE_OFFSET
which is at 0xC0000000
on the x86. This
means that 3GiB is available for the process to use while the remaining 1GiB
is always mapped by the kernel.
The linear virtual address space as the kernel sees it is illustrated in Figure
5.1. The area up to PAGE_OFFSET
is
reserved for userspace and potentially changes with every context switch. In
x86, this is defined as 0xC0000000
or at the 3GiB mark leaving
the upper 1GiB of address space for the kernel.
8MiB (the amount of memory addressed by two PGDs5.3) is reserved at PAGE_OFFSET
for loading the kernel
image to run. It is placed here during kernel page tables initialisation
as discussed in Section 4.6.1. Somewhere shortly after
the image5.4, the mem_map
for UMA architectures, as discussed
in Chapter 3, is stored. With NUMA
architectures, portions of the virtual mem_map
will be scattered
throughout this region and where they are actually located is architecture
dependent.
The region between PAGE_OFFSET
and VMALLOC_START
- VMALLOC_OFFSET
is the physical memory map and the size of the region
depends on the amount of available RAM. As we saw in Section 4.6, page table entries exist to map physical memory to the
virtual address range beginning at PAGE_OFFSET
. Between the
physical memory map and the vmalloc address space, there is a gap of space
VMALLOC_OFFSET
in size, which on the x86 is 8MiB, to guard
against out of bounds errors. For illustration, on a x86 with 32MiB of RAM,
VMALLOC_START
will be located at PAGE_OFFSET +
0x02000000 + 0x00800000
.
In low memory systems, the remaining amount of the virtual address space, minus
a 2 page gap, is used by vmalloc()
for representing non-contiguous
memory allocations in a contiguous virtual address space. In high memory
systems, the vmalloc area extends as far as PKMAP_BASE
minus the two page gap and two extra regions are introduced. The first, which
begins at PKMAP_BASE
, is an area reserved for the mapping of
high memory pages into low memory with kmap()
as discussed in
Chapter 10. The second is for fixed
virtual address mappings which extend from FIXADDR_START
to FIXADDR_TOP
. Fixed virtual addresses are needed
for subsystems that need to know the virtual address at compile
time such as the Advanced Programmable Interrupt Controller
(APIC)5.5. FIXADDR_TOP
is statically defined to be
0xFFFFE000
on the x86 which is one page before the end of the
virtual address space. The size of the fixed mapping region is calculated
at compile time in __FIXADDR_SIZE
and used to index
back from FIXADDR_TOP
to give the start of the region
FIXADDR_START
The region required for vmalloc()
, kmap()
and the fixed
virtual address mapping is what limits the size of ZONE_ NORMAL
. As
the running kernel needs these functions, a region of at least
VMALLOC_RESERVE
will be reserved at the top of the address
space. VMALLOC_RESERVE
is architecture specific but on the x86,
it is defined as 128MiB. This is why ZONE_ NORMAL
is generally referred
to being only 896MiB in size; it is the 1GiB of the upper potion of the linear
address space minus the minimum 128MiB that is reserved for the vmalloc region.
Footnotes
- ... PGDs5.3
- 8MiB is simply a reasonable amount of space to reserve for the purposes of loading the kernel image
- ... image5.4
- Usually at the 16MiB mark to keep memory reserved for
ZONE_ DMA
. - ... (APIC)5.5
- Further discussion on the APIC is beyond the scope of this document.
Next: 5.2 Managing the Address Up: 5. Process Address Space Previous: 5. Process Address Space   Contents   Index Mel 2004-02-15