开发者社区> 问答> 正文

linux寻找可用最高页面号函数find_max_pfn的疑惑,请各位指点!

* 
 * 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[i].type != E820_RAM) 
            continue; 
        start = PFN_UP(e820.map[i].addr); 
        end = PFN_DOWN(e820.map[i].addr + e820.map[i].size); 
        if (start >= end) 
            continue; 
        if (end > max_pfn) 
            max_pfn = end; 
    } 
}

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

展开
收起
a123456678 2016-06-12 15:49:55 2558 0
1 条回答
写回答
取消 提交回答
  • 对于这种代码量如此之大的分析研究,最好是先整块整块的看,知道它的运行原理比看明白它每一行代码要重要的多,毕竟,你完全明白代码后,可能过两天又变了。而你明白原理之后,不过是算法上的不同而已,自己觉得看着不爽的,大可自己实现一个同样功能的。

    2019-07-17 19:34:20
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Alibaba Cloud Linux 3 发布 立即下载
ECS系统指南之Linux系统诊断 立即下载
ECS运维指南 之 Linux系统诊断 立即下载