今天突然心血来潮,想研究一下kmalloc,关于kmalloc,cu上一篇博文,写的极其详细
http://www.cublog.cn/u1/57901/showart_1920139.html这儿想补充一点,前几天有人问为什么kmalloc分配的空间,虚拟地址与物理地址之间的差值是固定的,即
va = pa + PAGE_OFFSET;
注意在struct page *new_slab(struct kmem_cache *s, gfp_t flags, int node)函数中有这样的一段代码:
start = page_address(page);
注意这儿的start是虚拟地址,关于page_address的定义如下:
- #define page_address(page) ((page)->virtual)
那么关键就是看这个虚拟地址了。
这儿找到了memmap_init_zone函数。在该函数中:
- #ifdef WANT_PAGE_VIRTUAL
-
/* The shift won't overflow because ZONE_NORMAL is below 4G. */
-
if (!is_highmem_idx(zone))
-
set_page_address(page, __va(pfn << PAGE_SHIFT));
-
#endif
这是一段条件编译,但是如果WANT_PAGE_VIRTUAL不成立呢?
我们再次看一看关于 page_address的定义
- #if defined(WANT_PAGE_VIRTUAL)
-
#define page_address(page) ((page)->virtual)
-
#define set_page_address(page, address) \
-
do { \
-
(page)->virtual = (address); \
-
} while(0)
-
#define page_address_init() do { } while(0)
-
#endif
-
- #if defined(HASHED_PAGE_VIRTUAL)
-
void *page_address(struct page *page);
-
void set_page_address(struct page *page, void *virtual);
-
void page_address_init(void);
-
#endif
- #if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
-
#define page_address(page) lowmem_page_address(page)
-
#define set_page_address(page, address) do { } while(0)
-
#define page_address_init() do { } while(0)
-
#endif
当WANT_PAGE_VIRTUAL不成立的时候L
#define page_address(page) lowmem_page_address(page)
static __always_inline void *lowmem_page_address(struct page *page)
{
return __va(page_to_pfn(page) << PAGE_SHIFT);
}
所以不管宏是不是WANT_PAGE_VIRTUAL成立,这些页的虚拟地址与物理地址之间的差值是固定的。
阅读(2301) | 评论(0) | 转发(0) |