Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1264214
  • 博文数量: 482
  • 博客积分: 13297
  • 博客等级: 上将
  • 技术积分: 2890
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-12 16:25
文章分类

全部博文(482)

文章存档

2012年(9)

2011年(407)

2010年(66)

分类: LINUX

2011-11-29 09:07:27

发表于:2010-08-27 20:40:00
#define page_to_virt(page) ((((page) - mem_map) << PAGE_SHIFT) + PAGE_OFFSET)


struct page 这个page只是一个结构体而已,那传到上面的page至少应该是个地址或者是个unsigned long型,上面的那个宏是怎么算出虚拟地址的呢?


如果我随便定义一个 struct page test; page_to_virt(test);这样是能得到结果的。但明显不对,我哪里理解错了吗?  
回复于:2010-08-27 21:26:57
宏里面的page和mem_map 都应该是struct page *
两个相同类型的指针相减,得到的是他们之间的页数。
页数<
LZ举的那个例子,应该是page_to_virt(&test)
回复于:2010-08-28 05:18:58
如果我随便定义一个 struct page test; page_to_virt(test);这样是能得到结果的。



又想了一下,感觉还是没明白,struct page只是个结构体,可以随便定义其指针和变量,定义其指针也只是一个执行struct page的指针,而这个指针也只是指向结构体的指针,这个指针的地址是怎么和实际的page在mem_map的位置联系起来的?


各位指点指点

====

阅读(1496) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

Alan05212011-11-29 09:12:46

我觉得mem_map应该是存放struct page结构的首地址,而page - mem_map是页帧号,在<< PAGE_SHIFT应该是得到物理地址,而内核线性地址区与物理地址就是相差PAGE_OFFSET(3G)的