Библиотека сайта 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: 10.2 Mapping High Memory Up: 10. High Memory Management Previous: 10. High Memory Management   Contents   Index
10.1 Managing the PKMap Address Space
Space is reserved at the top of the kernel page tables from
PKMAP_BASE
to FIXADDR_START
for a PKMap. The
size of the space reserved varies slightly. On the x86, PKMAP_BASE
is at 0xFE000000 and the address of FIXADDR_START
is a compile
time constant that varies with configure options but is typically only a
few pages. This means that there is slightly below 32MiB of page table space
for mapping pages from high memory into usable space.
For mapping pages, a single page set of PTEs is stored at the beginning of
the PKMap area to allow 1024 high pages to be mapped into low memory for short
periods with the function kmap()
and unmapped with kunmap()
.
The pool seems very small but the page is only mapped by kmap()
for a very short time. Comments in the code indicate that there was
a plan to allocate contiguous page table entries to expand this area but
it has remained just that, comments in the code so a large portion of the
PKMap is unused.
The page table entry for use with kmap()
is called
pkmap_page_table
which is located at PKMAP_BASE
and set up during system initialisation10.2. The pages
for the PGD and PMD entries are allocated by the boot memory allocator to
ensure they exist.
The current state of the page table entries is managed by a simple array
called called pkmap_count
which has LAST_PKMAP
entries in it. On an x86 system without PAE, this is 1024 and with PAE, it is
512. More accurately, albeit not expressed in code, the LAST_PKMAP
variable is equivalent to PTRS_PER_PTE
.
Each element is not exactly a reference count but it is very close. If the
entry is 0, the page is free and has not been used since the last TLB flush. If
it is 1, the slot is unused but a page is still mapped there waiting for a
TLB flush. Flushes are delayed until every slot has been used at least once
as a global flush is required for all CPUs when the global page tables are
modified and is extremely expensive. Any higher value is a reference count
of n-1
users of the page.
Footnotes
- ... initialisation10.2
- On the x86, this takes
place at the end of the
pagetable_init()
function.
Next: 10.2 Mapping High Memory Up: 10. High Memory Management Previous: 10. High Memory Management   Contents   Index Mel 2004-02-15