免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 独孤九贱
打印 上一主题 下一主题

我理解的逻辑地址、线性地址、物理地址和虚拟地址(补充完整了) [复制链接]

论坛徽章:
0
1 [报告]
发表于 2008-03-29 12:58 |显示全部楼层
原帖由 vestige 于 2008-3-29 12:42 发表
我对这里还有一点疑问:
从软件的角度上来讲,因为它的项只有一个,32位,刚好可以存放与PGD中长度一样的地址指针。那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,一一转手就可以了。这样,就 ...

不是,对页表的操作,是逐级获得指向下一级的指针,对于PUD的操作,实际上仍然是返回指向PGD的指针。
这里有段代码,虽然不是x86页表操作的代码,但性质是一样的,可以解释这个问题。
/*
代码中所有和pud有关的部分都是假的,被实现成空函数,例如pud_alloc_one()、pgd_cmpxchg_rel()等等
*/
pgd = pgd_offset(mm, mpaddr);
again_pgd:
    if (unlikely(pgd_none(*pgd))) { // acquire semantics

        pud_t *old_pud = NULL;
        pud = pud_alloc_one(mm, mpaddr);
        if (unlikely(!pgd_cmpxchg_rel(mm, pgd, old_pud, pud))) {
            pud_free(pud);
            goto again_pgd;
        }
    }

    pud = pud_offset(pgd, mpaddr); //这里仍然返回指向PGD的指针
again_pud:
    if (unlikely(pud_none(*pud))) { // acquire semantics

        pmd_t* old_pmd = NULL;
        pmd = pmd_alloc_one(mm, mpaddr);
        if (unlikely(!pud_cmpxchg_rel(mm, pud, old_pmd, pmd))) {
            pmd_free(pmd);
            goto again_pud;
        }
    }

    pmd = pmd_offset(pud, mpaddr);
again_pmd:
    if (unlikely(pmd_none(*pmd))) { // acquire semantics

        pte_t* old_pte = NULL;
        pte_t* pte = pte_alloc_one_kernel(mm, mpaddr);
        if (unlikely(!pmd_cmpxchg_kernel_rel(mm, pmd, old_pte, pte))) {
            pte_free_kernel(pte);
            goto again_pmd;
        }
    }

论坛徽章:
0
2 [报告]
发表于 2008-03-29 18:50 |显示全部楼层
原帖由 vestige 于 2008-3-29 15:49 发表
Thanks 楼上 a lot!

我看ULK里讲到:
The kernel keeps a position for the Page Upper Directory and the Page Middle Directory by setting the number of entries in them to 1 and mapping these ...

我也不清楚这里的2级paging是什么意思。
我对x86的这部分不是很懂,但刚才去看了一下,确实分配了pmd的,应该是三级level。我看的代码是2.6.20,不知道这个版本还支持2级level不。不太懂,不好意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP