Chinaunix首页 | 论坛 | 博客
  • 博客访问: 752124
  • 博文数量: 79
  • 博客积分: 2671
  • 博客等级: 少校
  • 技术积分: 1247
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-02 15:26
个人简介

宅男

文章分类

全部博文(79)

文章存档

2017年(11)

2016年(12)

2015年(6)

2012年(10)

2011年(33)

2010年(7)

分类: LINUX

2011-06-27 10:53:24

今天突然心血来潮,想研究一下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的定义如下:
  1. #define page_address(page) ((page)->virtual)
那么关键就是看这个虚拟地址了。
这儿找到了memmap_init_zone函数。在该函数中:
  1. #ifdef WANT_PAGE_VIRTUAL
  2.         /* The shift won't overflow because ZONE_NORMAL is below 4G. */
  3.         if (!is_highmem_idx(zone))
  4.             set_page_address(page, __va(pfn << PAGE_SHIFT));
  5. #endif
这是一段条件编译,但是如果WANT_PAGE_VIRTUAL不成立呢?
我们再次看一看关于 page_address的定义
  1. #if defined(WANT_PAGE_VIRTUAL)
  2. #define page_address(page) ((page)->virtual)
  3. #define set_page_address(page, address)            \
  4.     do {                        \
  5.         (page)->virtual = (address);        \
  6.     } while(0)
  7. #define page_address_init() do { } while(0)
  8. #endif
  9. #if defined(HASHED_PAGE_VIRTUAL)
  10. void *page_address(struct page *page);
  11. void set_page_address(struct page *page, void *virtual);
  12. void page_address_init(void);
  13. #endif

  14. #if !defined(HASHED_PAGE_VIRTUAL) && !defined(WANT_PAGE_VIRTUAL)
  15. #define page_address(page) lowmem_page_address(page)
  16. #define set_page_address(page, address) do { } while(0)
  17. #define page_address_init() do { } while(0)
  18. #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) |
给主人留下些什么吧!~~