+ -
当前位置:首页 → 问答吧 → 问个内存映射的问题

问个内存映射的问题

时间:2010-10-22

来源:互联网

假设物理内存大小为1G,内核对前896MB直接映射到第三个GB里,那么进程地址空间0-3GB映射在物理地址的哪里呢?如果只映射在高端内存,那么肯定是不合理的。所以,我想,每个进程最终映射到的物理地址可能与内核直接映射的空间重复,这样的话,岂不是没起到保护的作用(即没有ring0也可以访问内核空间的内存了)。不知道我哪里理解错了,好困惑!大神们请指点。

作者: 论坛ID   发布时间: 2010-10-22

我理解的是:
内核将物理内存为0---896MB中可用的的地址空间通过+3G来映射到内核空间,这样内核能够快速的访问物理内存。
而进程的用户空间在0---3GB,进程的地址空间是线性区组成的,内核给进程分配空间是通过分配线性区来完成的,只是将一段线性区分配给进程,并没有分配物理页。当进程访问到该线性区是就会引发缺页中断,从而分配物理页并建立映射。

作者: flike   发布时间: 2010-10-22

回复 flike


    你的意思是在需要的时候在vmalloc分配器区分配吗,这个地址也是在3G以上的空间里,也是内核空间阿。是不是3G前的总是映射到3G后的某一个地址?

作者: 论坛ID   发布时间: 2010-10-22

回复 论坛ID



QUOTE:
    内核对前896MB直接映射到第三个GB里



这句话有问题,方向错了,应该是把第三个GB里的前896M映射到物理内存的前896M(固定偏移)
但是,前3个GB的虚拟地址空间的任何一个地址仍然可以映射到物理内存的前896M的任何free的地址(你的kernel的代码和数据是绝对不可能有896M的).

还有,映射!=分配

作者: snail_314   发布时间: 2010-10-22

回复 snail_314


    那进程的地址空间是不是都是在映射在了vmalloc那一段上呢?因为看书讲进程地址都是讲vm_area_struct的管理的。那么每一个物理地址至少映射在了两个地址(3G前,3G后)上吗?

作者: 论坛ID   发布时间: 2010-10-22

楼主需要把物理地址和虚拟地址的概念弄清楚... 这个版的精华区有关于linux内存的图的文章... 楼主可以参考一下.

作者: PCliangtao   发布时间: 2010-10-22

回复 论坛ID


    不是.
映射不等于分配.虚拟地址到物理地址的映射可以是多对一.

vm_area_struct和vmalloc也是两码子事

作者: snail_314   发布时间: 2010-10-22