Библиотека сайта 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: 7.2 Allocating Pages Up: 7. Physical Page Allocation Previous: 7. Physical Page Allocation   Contents   Index
7.1 Managing Free Blocks
As stated, the allocator maintains blocks of free pages where each block is a
power of two number of pages. The exponent for the power of two sized block is
referred to as the order. An array of free_area_t
structures are maintained for each order that points to a linked list of blocks
of pages that are free as indicated by Figure 7.1.
Hence, the 0th element of the array will point to a list of free page
blocks of size or 1 page, the 1st element will be a list of
(2) pages up to
number of pages, where the
MAX_ORDER
is currently defined as 10. This eliminates the
chance that a larger block will be split to satisfy a request where a smaller
block would have sufficed. The page blocks are maintained on a linear linked
list via page
list
.
Each zone has a free_area_t
struct array
called free_area[MAX_ORDER]
. It is declared in
linux/mm.h
as follows:
22 typedef struct free_area_struct { 23 struct list_head free_list; 24 unsigned long *map; 25 } free_area_t;
The fields in this struct are simply:
- free_list A linked list of free page blocks;
- map A bitmap representing the state of a pair of buddies.
Linux saves memory by only using one bit instead of two to represent each pair
of buddies. Each time a buddy is allocated or freed, the bit representing
the pair of buddies is toggled so that the bit is zero if the pair of pages
are both free or both full and 1 if only one buddy is in use. To toggle the
correct bit, the macro MARK_USED()
in page_alloc.c
is used which is declared as follows:
164 #define MARK_USED(index, order, area) \ 165 __change_bit((index) >> (1+(order)), (area)->map)
index
is the index of the page within the global mem_map
array. By shifting it right by 1+order
bits, the bit within map
representing the pair of buddies is revealed.
Next: 7.2 Allocating Pages Up: 7. Physical Page Allocation Previous: 7. Physical Page Allocation   Contents   Index Mel 2004-02-15