Библиотека сайта 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: 11.6 Page Replacement Policy Up: 11. Page Frame Reclamation Previous: 11.4 Shrinking all caches   Contents   Index
11.5 Swapping Out Process Pages
When max_mapped
pages have been found in the page cache,
swap_out()
is called to start swapping out process pages. Starting
from the mm_struct
pointed to by swap_mm
and the
address mm
swap_address
, the page tables are searched
forward until nr_pages
have been freed.
All process mapped pages are examined regardless of where they are in the
lists or when they were last referenced but pages which are part of the
active_list
or have been recently referenced will be skipped
over. The examination of hot pages is a bit costly but insignificant in
comparison to linearly searching all processes for the PTEs that reference
a particular struct page
.
Once it has been decided to swap out pages from a process, an attempt will
be made to swap out at least SWAP_CLUSTER
number of pages and the
full list of mm_struct
s will only be examined once to avoid
constant looping when no pages are available. Writing out the pages in bulk
increases the chance that pages close together in the process address space
will be written out to adjacent slots on disk.
swap_mm
is initialised to point to init_mm
and the
swap_address
is initialised to 0 the first time it is used. A
task has been fully searched when the swap_address
is equal to
TASK_SIZE
. Once a task has been selected to swap pages from,
the reference count to the mm_struct
is incremented so that it
will not be freed early and swap_out_mm()
is called with the
selected mm_struct
as a parameter. This function walks each
VMA the process holds and calls swap_out_vma()
for it. This
is to avoid having to walk the entire page table which will be largely
sparse. swap_out_pgd()
and swap_out_pmd()
walk the
page tables for given VMA until finally try_to_swap_out()
is called on the actual page and PTE.
try_to_swap_out()
first checks to make sure the page is not part
of the active_list
, been recently referenced or part of a zone
that we are not interested in. Once it has been established this is a page
to be swapped out, it is removed from the page tables of the process and
further work is performed. It is at this point the PTE is checked to see if
it is dirty. If it is, the struct page
flags will be updated
to reflect that so that it will get laundered. Pages with buffers are not
handled further as they can not be swapped out to backing storage so the PTE
for the process is simply established again and the page will be flushed later.
The process of allocating space in the backing storage and swapping pages out is discussed further in Chapter 12.
Next: 11.6 Page Replacement Policy Up: 11. Page Frame Reclamation Previous: 11.4 Shrinking all caches   Contents   Index Mel 2004-02-15