免费注册 查看新帖 |

Chinaunix

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

[内存管理] 菜鸟求教 linux内存管理的一个问题 [复制链接]

论坛徽章:
2
技术图书徽章
日期:2014-04-15 16:30:27金牛座
日期:2014-06-06 16:20:49
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-05 16:40 |只看该作者 |倒序浏览
    linux的内存管理相关的内容(专业书籍上看的)看过好5-6遍了,但是一直没搞明白,今天又看了一遍,看是没明白,但是终于知道怎么把问题描述清楚了,特来请教大家,先谢过。
    背景简单描述:内存访问,一般是“逻辑地址”转化为“线性地址”,再转化为实际的“物理地址”(可能“转化”该为“映射”更恰当)。
    问题1:在线性地址到物理地址,分为两级表项:directory和table。通过directory得到table的基址,然后根据table找到对应的分页,配上offset访问对应的物理地址。directory有2^10个表项;table呢,至少有2^10个。我的问题是:每一个directory项都有对应的table各自有1024个?或者说,不同的directory对应的table表有什么关系?
    问题2:完整的“内存访问过程”是怎么样子的?就是说,我们程序中(比如c语言中访问一个变量),那么如何通过种种映射关系访问到对应物理内存的内容?
    由于这两个问题可能不是一次回复我就能理解的(脸红),如果有可能的话,请留个联系方式,我想跟你专门的讨教。
再次谢过.

论坛徽章:
3
双鱼座
日期:2013-09-04 19:47:39天蝎座
日期:2013-12-11 20:30:532015年亚洲杯之澳大利亚
日期:2015-04-20 00:28:02
2 [报告]
发表于 2013-11-05 18:56 |只看该作者
回复 1# knull

   这是一个将virutal address解析得到的pte entry的函数。 是一个从不直接映射的虚拟地址转换成物理地址的过程。
3967 static int __follow_pte(struct mm_struct *mm, unsigned long address,
3968                 pte_t **ptepp, spinlock_t **ptlp)
3969 {
3970         pgd_t *pgd;
3971         pud_t *pud;
3972         pmd_t *pmd;
3973         pte_t *ptep;
3974
3975         pgd = pgd_offset(mm, address); // 根据mm->pgd找到的第一级page directory的物理地址, //再从解析地址知道是第几个 entry.从而获得下一级page directory的物理地址。
3976         if (pgd_none(*pgd) || unlikely(pgd_bad(*pgd)))   // 检测有没有引用下一级目录
3977                 goto out;
3978
3979         pud = pud_offset(pgd, address);  //和上面的过程差不多
3980         if (pud_none(*pud) || unlikely(pud_bad(*pud)))
3981                 goto out;
3982
3983         pmd = pmd_offset(pud, address);//和上面的过程差不多
3984         VM_BUG_ON(pmd_trans_huge(*pmd));
3985         if (pmd_none(*pmd) || unlikely(pmd_bad(*pmd)))
3986                 goto out;
3987
3988         /* We cannot handle huge page PFN maps. Luckily they don't exist. */
3989         if (pmd_huge(*pmd))     //可以不管
3990                 goto out;
3991                                                           
3992         ptep = pte_offset_map_lock(mm, pmd, address, ptlp);  // //和上面的过程差不多. 但要处理pte table可能在高端内存, 建立临时内核映射
3993         if (!ptep)
3994                 goto out;
3995         if (!pte_present(*ptep))          //检查有没有映射page frame
3996                 goto unlock;
3997         *ptepp = ptep;                       //找到了. **ptep就是要找到的物理页的起始。
3998         return 0;
3999 unlock:
4000         pte_unmap_unlock(ptep, *ptlp);
4001 out:
4002         return -EINVAL;
4003 }

把这个函数搞清楚, 你就知道这两个问题的答案了.

论坛徽章:
2
技术图书徽章
日期:2014-04-15 16:30:27金牛座
日期:2014-06-06 16:20:49
3 [报告]
发表于 2013-11-06 10:36 |只看该作者
回复 2# kiongf

非常感谢你的回复。我学习下
   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP