免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2264 | 回复: 6
打印 上一主题 下一主题

find_max_pfn函数有点不太明白,请高手指点! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-28 21:16 |只看该作者 |倒序浏览
本帖最后由 agloom 于 2011-11-28 23:33 编辑

/*
* Find the highest page frame number we have available
*/
static void __init find_max_pfn(void)
{
        int i;

        max_pfn = 0;
        for (i = 0; i < e820.nr_map; i++) {
                unsigned long start, end;
                /* RAM? */
                if (e820.map.type != E820_RAM)
                        continue;
                start = PFN_UP(e820.map.addr);
                end = PFN_DOWN(e820.map.addr + e820.map.size);
                if (start >= end)
                        continue;

                if (end > max_pfn)
                        max_pfn = end;
        }
}
请问:if (start >= end)
                continue;
条件判断目的是什么?宏PFN_UP和PFN_DOWN分别求地址所在页框的下一页和当前页框号。如果e820.map.addr 和 e820.map.addr + e820.map.size 表示的地址在同一个页框,或者分别在两个连续的页框里,这时start分别大于等于end,岂不是就直接跳过去了?但这时的end也有可能就是最高可用页框号啊!对这一点很迷惑,请各位指点,不甚感激!

论坛徽章:
0
2 [报告]
发表于 2011-11-29 22:41 |只看该作者
start >= end表示该e820项表示的内存区段中一个完整的页框都没有,不能算进去。只有是完整的页面才能被内核算进去,半截页面自然是不能算的,因为残缺的那部分不能使用。

论坛徽章:
0
3 [报告]
发表于 2011-11-30 00:50 |只看该作者
谢谢鸟菜小的回答。
不过我还有个疑问,如果e820.map.addr位于一页框的起始,e820.map.addr + e820.map.size 位于下一页的中间某个位置,这样就会有一页是完整的。可是此时start = end,依然会跳过这一页啊!还请指点!谢谢!

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
4 [报告]
发表于 2011-11-30 07:20 |只看该作者
本帖最后由 linuxfellow 于 2011-11-30 07:39 编辑
谢谢鸟菜小的回答。
不过我还有个疑问,如果e820.map.addr位于一页框的起始,e820.map.addr + e820.map.si ...
agloom 发表于 2011-11-30 00:50


PFN_UP/PFN_DOWN就像裁缝裁衣服一样,把地址按页面剪裁
PFN_UP是裁掉开始多余部分
PFN_DOWN裁掉结尾多余部分

  假定e820.map.addr=0
   假定e820.map.size =  PAGE_SIZE + 100

  start = PFN_UP(e820.map.addr) =0;
  end = PFN_DOWN(e820.map.addr + e820.map.size)=1;
这样会有一页是完整的, 但 start < end

  假定e820.map.addr=200
   假定e820.map.size =  PAGE_SIZE + 100
  start = PFN_UP(e820.map.addr) =1;
  end = PFN_DOWN(e820.map.addr + e820.map.size)=1;
虽然空间超过一页,经裁缝一裁,就没有一页是完整的

论坛徽章:
0
5 [报告]
发表于 2011-11-30 17:40 |只看该作者
PFN_UP/PFN_DOWN就像裁缝裁衣服一样,把地址按页面剪裁
PFN_UP是裁掉开始多余部分
PFN_DOWN裁掉结尾多 ...
linuxfellow 发表于 2011-11-30 07:20


谢谢你的回答,下午仔细看了下PFN_up宏的定义: #define PFN_UP(x)  (((x)+PAGE_SISZE-1)>>PAGE_SHIFT)
当x位于页框起始位置时PFN_UP(x)返回的页框号与X所在的页框号是一样的,只要X不位于起始位置,PFN_UP(x)返回下一个页框号。式子中-1的作用应该就是这个原因吧? 没仔细看这个宏的定义,只是书上写着PFN_UP(x)返回大于x的第1个页面号……,书并非那么可靠,呵呵!

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
6 [报告]
发表于 2011-12-01 10:04 |只看该作者
谢谢你的回答,下午仔细看了下PFN_up宏的定义: #define PFN_UP(x)  (((x)+PAGE_SISZE-1)>>AGE_SHIFT) ...
agloom 发表于 2011-11-30 17:40



    应该是+PAGE_SISZE的作用使起始地址不为0时得到下一个页面号
   -1的作用是保证起始地址为0时返回当前页面而不返回下一个页面。

论坛徽章:
0
7 [报告]
发表于 2011-12-01 13:03 |只看该作者
应该是+PAGE_SISZE的作用使起始地址不为0时得到下一个页面号
   -1的作用是保证起始地址为0时返 ...
linuxfellow 发表于 2011-12-01 10:04



    呵呵!我就是这个意思 ,可能表述的不清楚。谢谢你了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP