关于虚拟地址空间和虚拟内存的问题(求教)

恒水 发布于 2012/10/18 22:57
阅读 1K+
收藏 1

码上生花,ECharts 作品展示赛正式启动!>>>

最近遇到一个问题,纠结了好多次,书看了几遍,没有解决,故提问,希望会的人给予帮助,越详细越好,衷心谢谢!

我们知道每个进程有4GB的虚拟地址空间(32位机器下),被分为2部分,一部分是系统空间,一部分是用户空间,那么这个虚拟地址空间存储于什么地方(以前我知道他是不存在的,可是最近又迷糊了,如果是假想的空间,那么说分为2部分,岂不是没有意义,难道仅仅是为了逻辑上让人好理解吗),在os内存管理时,有这么一句话”MMU(内存管理单元)接收cpu发出的虚拟地址,将其翻译为物理地址后发送给内存。内存单元按照该物理地址进行相应访问后读出或写入相关数据“。不理解的是cpu既然发出虚拟地址,那它肯定是知道虚拟地址,它是如何从哪里怎么获取到的?另一个就是内存单元按照物理地址进行相应访问后读出或写入相关数据,内存单元貌似没有这个功能吧?还有就是”如果cpu发出的虚拟地址对应页面不在物理内存,就将产生一个缺页中断,缺页中断服务程序将负责将需要的虚拟页面找到并并加入到内存“,我在想虚拟地址空间是不是就是保存虚拟页面的地址的?它们两者(虚拟地址空间和虚拟内存)之间的关系是如何的呢?望给予指教。

加载中
0
寂寞沙洲
寂寞沙洲

2部分是逻辑上的意思吧 其实不就是一张表么 低位的映射到内核、显卡等硬件 高位给你用的百度 内存 分段 分页


0
泡不烂的凉粉
泡不烂的凉粉

楼主概念没搞清楚啊, 虚拟地址, 可以理解成逻辑地址, 由于进程之间是相互隔离的.一个进程死掉不影响另外进程的执行.所以,每个进程都有自己独立的虚拟地址.

虚拟地址当然是跟物理地址是映射关系,物理地址就是实实在在的硬件地址, 为了更好的管理内存, 系统使用线性地址空间. 这个是系统跟进程都共享的先行地址空间.

虚拟地址 分为两部分.为什么? 原因很简单. 虚拟地址是相对于进程来说的.每个进程只懂得自己的虚拟地址空间,但是进程与OS还有其他进程以及各种外部设备,比如显卡,键盘,等等.相互通信. 并且系统里还有共享库的存在,他们都是系统空间, 都是OS参与管理的. 用户进程只有少量权限可以操作这部分内存空间. 另外一部分可以用户进程自由访问.

虚拟地址,是相对于进程而言的.进程只认识虚拟地址. 每个进程都有自己的虚拟地址, 所有进程都有各自的虚拟地址,相互不干扰.虚拟地址分两大部分,一部分是进程自己管理实用的. 另一部分是所有进程都共享的, 被映射近自己的虚拟地址空间里.

虚拟地址跟线性地址是不同的概念, OS在使用的时候 会吧虚拟地址转换到线性地址然后做操作, 线性地址与物理地址是不同的概念. 物理地址是真实的地址空间,比如一个1G内存的机器,物理内存是1G,线性地址可以被分配到4G,32位地址总线. 也可是是 64T, 好像是 46位地址总线,印象不深刻,不一定对. 线性地址是唯一的系统地址, 虚拟地址是每个进程都有自己的虚拟地址, 他们是映射关系, 物理地址是真实的地址, 系统通过对线性地址对物理地址的映射进行管理真实的内存.

恒水
恒水
谢谢。
返回顶部
顶部