免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2008-02-22 21:44 |只看该作者
看过,不错! 学到了!

论坛徽章:
0
72 [报告]
发表于 2008-02-23 11:44 |只看该作者
好文,LZ很厉害!!!

[ 本帖最后由 _LoveLinux 于 2008-2-23 11:55 编辑 ]

61254_080216010548.gif (14.25 KB, 下载次数: 78)

61254_080216010548.gif

论坛徽章:
0
73 [报告]
发表于 2008-02-26 09:38 |只看该作者
佩服
光从排版的精神来说都值得称赞。

论坛徽章:
0
74 [报告]
发表于 2008-02-27 09:54 |只看该作者
看了,不错,收下了。

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
75 [报告]
发表于 2008-03-06 23:18 |只看该作者
感谢LZ的辛苦劳动

论坛徽章:
0
76 [报告]
发表于 2008-03-07 22:57 |只看该作者
好文章,很值得学习!!

论坛徽章:
0
77 [报告]
发表于 2008-03-09 19:26 |只看该作者

回复 #1 独孤九贱 的帖子

好帖啊,顶一下

论坛徽章:
0
78 [报告]
发表于 2008-03-10 13:22 |只看该作者
学习了~学习了~学习了~学习了~

论坛徽章:
0
79 [报告]
发表于 2008-03-29 12:42 |只看该作者

回复 #1 独孤九贱 的帖子

我对这里还有一点疑问:
从软件的角度上来讲,因为它的项只有一个,32位,刚好可以存放与PGD中长度一样的地址指针。那么所谓先到PUD,到到PMD中做映射转换,就变成了保持原值不变,一一转手就可以了。这样,就实现了“逻辑上指向一个PUD,再指向一个PDM,但在物理上是直接指向相应的PT的这个抽像,因为硬件根本不知道有PUD、PMD这个东西”。

我对“转手”这个过程不太了解,是不是一个32位的线性地址,先从头10位的PGD中取得PT的入口项,然后由于要兼容4级分页,需要把这个32位的线性地址拷贝到唯一的PUD入口,再拷贝到PMD入口,然后再得到PT的地址?这样做的话岂非效率很低?

论坛徽章:
0
80 [报告]
发表于 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;
        }
    }

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP