当前位置: 代码迷 >> 汇编语言 >> 关于虚拟内存的几个疑义
  详细解决方案

关于虚拟内存的几个疑义

热度:8462   发布时间:2013-02-26 00:00:00.0
关于虚拟内存的几个疑问
1:X86下段选择子加上偏移地址,总共可产生64TB的虚拟地址(每个段最大4GB),也就是说,如果取极端的话,程序可以大到64TB那么大,也就是说,我的编程空间(虚拟空间)可以大到64TB。但为什么网上都是说进程只有4GB的虚拟内存空间呢?


2:段选择子是程序编译时,编译器给出的,还是运行时,操作系统分配的?我觉得不大可能是运行时操作系统分配的。。


3:X86下提供分段和分页的硬件,用于支持内存管理和保护,其中分页是可选的,如果不选择分页功能,只开启分段功能的话,系统还有虚拟内存的功能吗?


4:如果分段可以实现虚拟内存,那它是如何实现的,我指的是,虚拟内存是如何与线性地址映射的,我们知道,如果不开启分页功能,那么线性地址就直接成为物理地址,而虚拟地址(64TB)不可能全部映射到线性地址(4GB)上,只有其中一小部分可以映射。那么不能映射的那部分虚拟地址是怎么在内存中表示的?极端点,比如说,有一个程序有1TB,分为1000个段,操作系统准备运行它,发现物理内存只够存放第一个段,那么是不是只在第一个段的选择子选择的描述符内分配实际地址给第一个段,而对于这个程序剩下的999个段的段选择子所指示的描述符,操作系统暂时无法给它们分配物理地址,于是将它们的存在位置为0? 也就是说,在分段下实现虚拟内存,是由编译器编译时将程序分段,操作系统运行程序时,为所有的程序段创建描述符,但只为部分描述符分配线性地址(没有开启分页,所以就是物理地址),其他暂时无法分配地址的程序段,操作系统就将它们的描述符的存在位置0,等到用到这些段时,再从硬盘调度它们。 请问我的理解对吗?


------解决方案--------------------------------------------------------
一、64T仅是虚拟地址空间,不是进程地址空间。

二、段选择子是由操作系统提供的,只有操作系统才知道一个进程要放在哪里。编译器编译的代码中,需要段选择子的地方都空着,由操作系统在加载进程的时候填入。

三、分段机制也可实现虚拟内存。但x86为页式虚存提供的支持要强于段式虚存,x86的PTE不仅带有P存在位,还有A位等可以用于标记是否被访问过及访问时间等信息的二进制位,有利于各种页面置换算法的计算。而段描述符仅有P存在位,对页面置换算法的支持较弱。

四、对
------解决方案--------------------------------------------------------
探讨
引用:
  朋友家的起居室16平米,我纳闷,为什么他用的是两米宽的床?


朋友,你的意思是不是虚拟地址空间虽然有64TB,但只分配了4GB给一个进程? 如果是这意思,那参考资料上说,利用虚拟内存,80386上可运行比4GB大的程序。这个又怎么解释呢?也就是说,如果说进程只有4GB的虚拟地址空间,那么岂不是大于4GB的进程就无法运行了?

------解决方案--------------------------------------------------------
程序完全可以用文件来模拟内存。
------解决方案--------------------------------------------------------
每一个SEL代表一个进程,以WINDOWS为例.进程只有低2G

GDT当然是系统维护的啊,如果所有进程都能随便写GDT的话,那还要保护模式来干什么呢!?(WINDOWS是采用页式管理所以只要切换CR3的PAGE地址就可以切换进程)

不开分页的话虚拟地址 = 物理地址

为什么一个程序要分N个段呢?个人没法理解
------解决方案--------------------------------------------------------
修改的不是代码,而且被操作的数据
进程是创建出来的,是以PE文件为基础由操作系统创建出来的,创建过程就包括了初始化 PE 文件
包括修改关键数据