关于虚拟地址和虚拟内存

xiansheng00 2009-03-19 03:50:18
最近看了以下Windows 核心编程,对于书上的概念湖里糊涂,里面有说物理存储器,磁盘文件,页文件,RAM
我为了把概念弄清,特地整理了一下.
物理存储器: 指的是计算机中的内存条和硬盘.
磁盘文件:在硬盘上的各种文件,比如**.exe和**.dll等
页文件:从硬盘上划分出的一小块区域.
RAM:计算机上的内存条

从上面的概念上来理解,得出的虚拟内存是由 RAM和页文件或者磁盘文件组成. 因为页文件和磁盘文件是实体的东西,都代表硬盘上的某个区域块. 这里,虚拟内存中的虚拟二字并不是说 RAM和页文件或者磁盘文件是虚的. 而是应该这样理解,虚拟两个字是以内存为参考对象,而虚拟内存中的内存指的内存条也就是RAM. 所以虚拟内存是内存条的相对概念,虚拟也是由实体的存储器构成(即内存条+硬盘上的区域块).

虚拟地址的概念:
不要和虚拟内存混淆,虚拟内存是区域块,而虚拟地址强调的是地址,这个地址可以达到4GB.
映射的概念:所谓的映射就是虚拟地址到虚拟内存的一种关系.当进程刚开始创建的时候,虚拟地址已经存在了,但它还没有指向虚拟内存.

保留,提交的概念:
所谓的保留是告诉操作系统,要从虚拟地址空间中拿出多少的范围来用,这样就系统就能统计这个虚拟地址空间已经用了多少,在用户级别是2GB.
提交就是把保留的虚拟地址空间映射到虚拟内存中的某个块,这样虚拟地址就指向了某个虚拟内存块(这个内存块不一定在内存条).

当CPU根据虚拟地址要访问虚拟内存上的数据时候,它会根据页表来查看这个数据是不是在内存条上,如果不在就查看是不是在硬盘上的某个区域块上(一般称为页文件上),如果在内存条上,就根据页表来定位内存条上的地址,并从内存条上取数据.如果在硬盘上的某个区域块,就要采用页文件交换技术,把硬盘上的数据复制到内存条上,然后CPU再从内存条上取数据.

以上是我个人的理解,如有不对,欢迎大家的批评,谢绝人身攻击
...全文
562 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiansheng00 2009-03-24
  • 打赏
  • 举报
回复
呵呵,多谢了,现在结帖.
xiansheng00 2009-03-23
  • 打赏
  • 举报
回复
呵呵,小弟也是刚硬着头皮把Windows 核心编程看完了,里面只不过是我的一些根本性的概念整理,多谢以上各位,特别感谢Zeroins的建议,接下来我想往更高一级走,但苦于不知要看哪些资料,希望大家推荐点资料.
Zeroins 2009-03-23
  • 打赏
  • 举报
回复
《Windows图形编程》(这本书可不是简单的 图形学+Windows编程,这也是一本系统级的书籍)
《天书夜读——从汇编语言到Windows内核编程》
《Undocumented Windows 2000 Secrets》
《软件调试》
《深入解析Windows操作系统》

《自己动手写操作系统》
《Linux内核完全剖析》

还有Intel网站上的:
《Intel 64 and IA-32 Architectures Software Developer's Manual》
kl2000 2009-03-21
  • 打赏
  • 举报
回复
虚拟地址的概念:
不要和虚拟内存混淆,虚拟内存是区域块,而虚拟地址强调的是地址,这个地址可以达到4GB.
映射的概念:所谓的映射就是虚拟地址到虚拟内存的一种关系.当进程刚开始创建的时候,虚拟地址已经存在了,但它还没有指向虚拟内存.

上面这句解释得相当好! 我也认同。 window 应用程序都是访问虚拟地址的, 然后虚拟地址跟虚拟内存有着对应的关系,之后的工作都是由操作系统完成。
kl2000 2009-03-21
  • 打赏
  • 举报
回复
物理存储器: 指的是计算机中的内存条和硬盘.

应该还包括 rom , 也就是显卡和主板等等的rom



kl2000 2009-03-21
  • 打赏
  • 举报
回复
学习
kl2000 2009-03-21
  • 打赏
  • 举报
回复
也就是说每个进程的地址空间是相对独立的! 每个进程空间都有00000000H-FFFFFFFFH (即4G),
所以在进程间通讯上为什么存在把某个进程的地址(00AFFFFF)传递给另一进程访问得不到在同一结果的原因!
比如进程一的地址:00AFFFFF 其实就是虚拟地址可能对应的的虚拟内存地址是:00AFFF0C , 而此时进程二的
地址00AFFFFF(其实就是虚拟地址), 可能的情况就多了! 第一:可能还没有提交对应上虚拟内存呢! 这时候
访问他就是nil 指针; 第二:已经提交了, 但是对应的虚拟地址是00A0000C , 所以就根本不是进程一的内容。
Zeroins 2009-03-21
  • 打赏
  • 举报
回复
楼主是从应用的涵义上去理解的,这些概念对应的具体实现还涉及到很多知识

比如:
“当CPU根据虚拟地址要访问虚拟内存上的数据时候,它会根据页表来查看这个数据是不是在内存条上,如果不在就查看是不是在硬盘上的某个区域块上(一般称为页文件上),如果在内存条上,就根据页表来定位内存条上的地址,并从内存条上取数据.如果在硬盘上的某个区域块,就要采用页文件交换技术,把硬盘上的数据复制到内存条上,然后CPU再从内存条上取数据.”

实际CPU也好,操作系统也好,没有谁在访问前去查看某页是否在内存中(如果楼主有进程调度的知识会知道,此时操作系统根本无法主动去查看)。

CPU提供了分段机制和分页机制,分段机制把逻辑(虚拟)地址转换成线性地址,分页则把线性地址转换成物理地址。Windows操作系统的GDT表中,各个段大多都对应整个平坦的4G地址空间,这样逻辑地址就等于线性地址了。在将线性地址转换成物理地址的过程中,CPU要去判断页目录项/页表项中的P位,此位用来表示当前地址所对应的页表/页是否存在于内存中。当当前活动线程的指令要求CPU访问一个内存地址时,如此地址涉及的页表/页在内存中不存在,会产生14号缺页中断,CPU会把导致缺页的地址放入CR2寄存器,并转去执行IDT中对应的中断服务例程。此例程在实际中由操作系统提供。此例程会根据CR2中保存的线性地址将引发中断的页表/页从磁盘交换到内存,然后返回。因为14号中断是一个错误(Fault)类型的异常,CPU会在中断服务例程返回后从导致此异常的指令处重新开始执行,而此时所要访问的页表/页已经在内存中了,线程会正常的执行下去,并不知道曾经发生了异常。

要超过一般书籍在应用层次上的描述,理解真正的存储管理,还要掌握非常多的内容。大家一起努力吧,共勉之。
autumn1225 2009-03-20
  • 打赏
  • 举报
回复
页表和虚拟内存没有什么关系的吧.

虚拟内存,转换成物理地址,还要通过GDT,和LDT.

然后查找CR3的内容.

GDT,和LDT,是一个数组,每个单元,有8个字节.

查找他们时的索引就是CS的值.

具体我也不理解...:(
xzdgy 2009-03-20
  • 打赏
  • 举报
回复
ding
lili830209 2009-03-20
  • 打赏
  • 举报
回复
ding
sizemismatch 2009-03-20
  • 打赏
  • 举报
回复
mark
lili830209 2009-03-20
  • 打赏
  • 举报
回复
mark
changhe325 2009-03-20
  • 打赏
  • 举报
回复
我还以为虚拟内存指的是那些页表呢……

那些页表指的是什么?
changhe325 2009-03-20
  • 打赏
  • 举报
回复
再次学习……嘿嘿 lz出贴 我提问……
xiansheng00 2009-03-20
  • 打赏
  • 举报
回复
页表就在创建进程的时候已经存在于内存条里面了,它就相当于新华字典里面的目录,当CPU通过虚拟地址要访问虚拟内存里的数据时候,CPU首先要查看页表,由于那个页表是在内存条里面,CPU可以直接访问.如果要访问的数据不在内存条里面,就要从硬盘上的页文件里查找,如果数据在页文件里,则把包含那个数据的页拷贝到内存条里,然后更新页表,使页表指向那个内存条.然后CPU就可以根据页表所指向的内存地址里面取数据.所以说页表充当虚拟地址到内存条地址的工具.说白了页表就是一个索引块.
xiansheng00 2009-03-20
  • 打赏
  • 举报
回复
页表就在创建进程的时候已经存在于内存条里面了,它就相当于新华字典里面的目录,当CPU通过虚拟地址要访问虚拟内存里的数据时候,CPU首先要查看页表,由于那个页表是在内存条里面,CPU可以直接访问.如果要访问的数据不在内存条里面,就要从硬盘上的页文件里查找,如果数据在页文件里,则把包含那个数据的页拷贝到内存条里,然后更新页表,使页表指向那个内存条.然后CPU就可以根据页表所指向的内存地址里面取数据.所以说页表充当虚拟地址到内存条地址的工具.说白了页表就是一个索引块.
changhe325 2009-03-19
  • 打赏
  • 举报
回复
恩……多谢指教呵呵
changhe325 2009-03-19
  • 打赏
  • 举报
回复
恩……多谢指教呵呵
xiansheng00 2009-03-19
  • 打赏
  • 举报
回复
"假设虚拟内存能指向4G空间。那么这个虚拟内存实际占用的物理空间是多大呢?"
虚拟内存多大物理空间就多大,这里的物理空间就是内存条和硬盘上的页文件或者*.exe *.dll的总合.
加载更多回复(1)

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧