Библиотека сайта 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
Space is reserved at the top of the kernel page tables from
FIXADDR_START for a PKMap. The
size of the space reserved varies slightly. On the x86,
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
The pool seems very small but the page is only mapped by
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
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
pkmap_count which has
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
variable is equivalent to
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
n-1 users of the page.
Next: 10.2 Mapping High Memory Up: 10. High Memory Management Previous: 10. High Memory Management   Contents   Index Mel 2004-02-15