全部博文(41)
2011年(41)
分类: 嵌入式
2011-07-02 21:21:16
首 先我自己总结了一句话,虚拟存储技术(不称呼为虚拟内存避免概念混淆不清)是一种机制,把寻址的空间和存储空间分离,然后通过硬件、内核、操作系统、软件 来控制寻址空间和存储空间的映射来达到高效利用内存,扩大内存,保护内存,共享内存以及实现其他一些机制。这句话是重要的,也许对我现在而言,因为下面的 一些概念名词我现在还不知道具体的意思,但是我明显的感觉我不能研究与一些概念上的理解了,我需要理解的是实现的机制。有人看了我的文章后发现我的错误或 有不同意见的欢迎留言交流。
首先一些名词概念
物理寻址: CPU直接使用物理地址访问物理存储器
虚拟寻址: CPU使用虚拟地址,虚拟地址经常地址翻译得到物理地址然后通过物理地址访问存储器。虚拟地址-->地址翻译-->物理地址-->存储器访问。虚拟寻址是间接寻址。
物理地址空间: 整个的物理存储器的最大可以寻址空间,或者说与物理存储器的M个字节相对应。
虚拟地址空间: 带有虚拟存储器的系统中,CPU虚拟寻址的最大空间,这个空间与最大地址所需要的位数来描述,现代系统典型是32位或者64位虚拟地址空间。
注意:因为虚拟存储技术需要使用磁盘的一部分来当做内存来使用,所以有人把这个地址空间称为磁盘存储器地址空间。
物理内存 : 这个好理解,就是你的内存条
虚拟内存:这个有点模糊,也许是我自己没有搞懂吧,嘿嘿
第一,深入理解计算机体系一书的原文 :概念上而言,虚拟存储器(VM)被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组。从这句话看来,虚拟内存应该是说就是从磁盘上划分为内存的部分,还有一些地方我也看到这么说的。
第二,我上网搜集了一下,发现还有一种说法,就是说虚拟内存是磁盘存储器 + 物理内存才是虚拟内存,更有人在Windows上用超级兔子或者其他软件看过,虚拟内存是磁盘存储器和物理内存之和。
这 个我的理解,一来应该是我理解不清的缘故,也与是一个概念的混淆了,但是我现在暂且先不必多纠与虚拟内存的概念,不管是哪一个概念应该说磁盘存储器是为了 扩充内存容量,与物理页进行页交换,暂存物理内存中不经常使用的页或者物理内存不足是交换出来的页,应该说这构成虚拟存储技术的一部分。这样的话那不管是 那种概念我们把里面的原理弄明白了那就没问题了。
虚拟地址的翻译和判断依赖与页表,页表分为内页表和外页表,内页表用于虚拟地址到物理地址的转换(一般的说的比较多的就是这个转换),外页表用于虚拟地址到磁盘存储器的转换。具体的实现很多地方写的很清楚,我转载的下一篇文章中也讲得很清楚。因为很多地方没有提及到外页表,所以这个地方我迷茫了好久。具体的通过页表转换地址见下一篇文章。
对于我们做了这么多的转换如果只是为了扩充内存的容量的话那这些都是不值得的,因为对于缺页或者交换页的代价是很高的, 因为磁盘存储器本质上还是访问磁盘,只是把它当存储器用,所以现代的系统一般把页交换时CPU切换进程去执行其他的事情。那究竟虚拟存储器的优势在哪里 呢?
第一,当然很明显的还是扩充了内存的容量,这个的话对程序员所使用的空间来说看起来变大了可以执行占内存更大的程序了。
第二, 保护内存,因为每一个地址都是需要通过MMU来翻译的,通过给页表设定标记位,比如设定可读 可写 等位的设置来保护只读内存。
第三,内存共享,不同的虚拟地址可以映射到同一物理地址可以实现内存的共享。很多时候用户需要共享代码数据或者库函数。通过虚拟内存可以很容易实现,而不是每一个进程都有一份拷贝。
第四,简化链接,连接器使得分离编译成为可能,对于大型的程序可以分解为小的模块,然后独立的修改和编译在链接 到一起。当我们改变其中一些模块是只要重新编译这个模块然后再将它链接到应用程序上。对于一个模块重新编译后,如果不使用虚拟内存的话对应的内存则将改 变,则需要重新编译整个模块。但是对于有虚拟体统的体系则因为是通过地址翻译,而且每个进程都拥有独立的地址虚拟地址空间,尽管物理内存的分配发生了改 变,但是虚拟地址可以不变,只是虚拟地址到物理地址的对应关系发生了改变。
第五,简化存储器的分配,对于使用molloc等函数分配一段连续的空间而已,虚拟存储器分配K个连续的虚拟空间,然后对应到物理存储的话可以映射到任意的K个物理空间了,不一定连续。
当然虚拟存储技术还远远不止这些,况且这些知识还有好多没弄明白,但是不能太纠结与一些问题的追究,暂且先写到这里,以后继续完成这个系列的知识。
2011-07-01 21:15