Библиотека сайта 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: 4.7 Mapping addresses to Up: 4. Page Table Management Previous: 4.5 Allocating and Freeing   Contents   Index
When the system first starts, paging is not enabled as page tables do not magically initialise themselves. Each architecture implements this differently so only the x86 case will be discussed. The page table initialisation is divided into two phases. The bootstrap phase sets up page tables for just 8MiB so the paging unit can be enabled. The second phase initialises the rest of the page tables. We discuss both of these phases below.
The assembler function
startup_32() is responsible for
enabling the paging unit in
arch/i386/kernel/head.S. While all
normal kernel code in
vmlinuz is compiled with the base address
PAGE_OFFSET + 1MiB, the kernel is actually loaded beginning
at the first megabyte (0x00100000) of memory4.2. The
bootstrap code in this file treats 1MiB as its base address by subtracting
__PAGE_OFFSET from any address until the paging unit is
enabled so before the paging unit is enabled, a page table mapping has to
be established which translates the 8MiB of physical memory at the beginning
of physical memory to the correct place after
Initialisation begins with statically defining at compile time an
swapper_pg_dir which is placed using linker
directives at 0x00101000. It then establishes page table entries for 2 pages,
pg1. As the Page Size Extension
(PSE) bit is set in the
cr4 register, pages translated are 4MiB
pages, not 4KiB as is the normal case. The first pointers to
pg1 are placed to cover the region
the second pointers to
pg1 are placed at
PAGE_OFFSET+1MiB. This means that when paging is enabled, they
will map to the correct pages using either physical or virtual addressing.
Once this mapping has been established, the paging unit is turned on by setting
a bit in the
cr0 register and a jump takes places immediately to
ensure the Instruction Pointer (EIP register) is correct.
The function responsible for finalising the page tables is called
paging_init(). The call graph for this function on the x86
can be seen on Figure 4.4.
pgd_t used by the kernel, the boot memory allocator
(see Chapter 6) is called to allocate a page
for the PMD. Similarly, a page will be allocated for each
allocator. If the CPU has the PSE flag available, it will be set to enable
extended paging. This means that each page table entry in the kernel paging
tables will be 4MiB instead of 4KiB. If the CPU supports the PGE flag,
it also will be set so that the page table entry will be global. Lastly,
the page tables from
PKMAP_BASE are set up with the function
fixrange_init(). Once the page table has been fully setup,
the statically defined page table at
swapper_pg_dir is loaded
again into the
cr3 register and the TLB is flushed.
- ... memory4.2
- The first megabyte is used by some devices for communication with the BIOS and is skipped.
Next: 4.7 Mapping addresses to Up: 4. Page Table Management Previous: 4.5 Allocating and Freeing   Contents   Index Mel 2004-02-15