芝士火腿:关于Linux内存管理的一些问题
来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 14:29:32
关于Linux内存管理的一些问题
[日期:2007-07-03] 来源:Linux公社 作者:Linuxidc 这段时间被linux的内存管理弄得有点头晕,今天终于“顿悟”。至于一些基础性的知识就不说了,很多书都有,说得很精彩。这里主要谈谈内核对于内存管理的一些比较没人提到的部分。
我们都知道,内核把线性地址(大多数情况也叫虚拟地址)分为三个部分:物理内存映射区,VMALLOC映射区以及固定映射地址区。这里主要讨论前两种。
所谓的物理内存映射区是指与物理内存一一映射的区域。举个例子来说,如果系统有物理内存512M,那么从0xc0000000至0xc00000000+512M的线性地址就属于物理内存映射区。这块线性地址在系统初始化时就与物理内存建立起一一对应的关系。这里的一一映射是指物理地址和线性地址就差一个偏移量0xc0000000,函数__pa()就是直接把线性地址减去0xc0000000得到物理地址。所以该函数应用范围也就局限于物理地址映射区。对另两个地址区进行__pa()是错误的。道理很简单,物理地址都没那么大。
VMALLOC映射区的特点是连续的线性地址,其物理地址不一定连续。这种映射特点和用户地址空间的映射方式是一样的。而前面讲的物理内存映射区,线性地址和物理地址显然都是连续的。当然了,最后的映射肯定是指线性地址和物理地址之间的映射。所以这部分的线性地址最终也需映射到物理内存中。这就会和物理内存映射区产生冲突:因为所有的物理内存在物理内存映射区已经有了一个线性地址了。但是我们知道,物理内存并不是每时每刻都在使用的,也就是说虽然它已经映射了,但是还没有人使用它。那么我们可以在VMALLOC映射区中先映射到那些没使用的内存并锁住。这样这些内存就不会再被分配作为其他用途。所以虽然映射有冲突,但是没有两个线性地址在同时使用。
因为VMALLOC映射区的线性地址和物理地址没有固定的映射关系,我们只能通过查找页表来找到对应的物理页框。值得一提的是,物理页框(structpage结构体)的vitual字段仍然存放的是物理内存映射区的线性地址,也就是说如果对该物理地址进行__page_to_vir()运算后,所得的线性地址不是VMALLOC映射区的线性地址。
以上就是我对linux内存管理的一些理解。欢迎大家讨论
关于Linux内存管理的一些问题
linux进程/内存管理的数据结构之
Linux的内存管理 - skeeter - ChinaUnix个人空间 - Powere...
linux进程/内存管理的数据结构之u区
关于女人的一些问题
关于开发票的一些问题
关于面试的一些问题
关于画册设计的一些问题
关于当前一些问题的个人看法
关于液体钽电容的一些注意问题
关于翡翠一些问题的解答
关于Linux下kernel.shmmax的设置问题
关于C程序运行时的内存 的一些理解【转】
关于鹭港小区的管理问题
如何优化内存的管理
Oracle9i的物理内存管理
非常不错的一些关于管理方面小故事
关于商业类、管理类书籍的一些杂想
释放linux内存
探索 Linux 内存模型
关于放松和入静的一些问题之我见
请教一些关于担保公司的问题1
] 邪淫与福气—关于一些问题的解答
关于美国留学生活一些安全的问题