Board logo

标题: 关于进程地址空间和虚拟内存的概念 [打印本页]

作者: yuyang911220    时间: 2017-5-10 10:21     标题: 关于进程地址空间和虚拟内存的概念

虚拟内存世上本不存在,在8086或者说80186(不要说没听过,后来多用于单片机了)以前,程序对内存的访问,不管是代码地址还是数据地址,都是直来直去,是几号单元就去几号内存单元找,当然,最复杂的也就算段地址×16+偏移地址了。
   从286开始引入虚拟内存,当然,我们现在很少见到针对286虚拟内存的程序。
   经过完善,386时虚拟内存全面登场,“虚拟内存”加上“32位数据和地址”两大特性成为划时代的经典CPU,这也是现在很多操作系统文件中残留i386、386、32等字样的历史原因。
   386的一大突破就是设计了一个功能强大(相对286)可以使用虚拟内存地址寻址的MMU(内存管理单元),把物理内存(简称内存)划分成一页一页来管理,一页内存大小是固定的(一般是4KB并按4KB地址对齐),把每页的首地址按顺序排成一个数组放在内存,称为页表,页表的大小也是固定的,再把页表的首地址排成数组放在内存,称为页目录表,再把页目录表的首地址用一个专用CPU寄存器保存。
   程序代码通过MMU进行虚拟内存寻址时,先取出专用寄存器中保存的页目录表首地址,再用32位虚拟地址的高20位作为索引来一层一层的查目录表查页表找到物理内存页的首地址,用虚拟地址低12位(对于4kb页)做页内偏移来找到指定单元。
   如果非要说的再明白一点,那么:虚拟内存就是程序代码不能直接访问物理内存的一种间接访问物理内存的机制。或者说是把程序中的地址值x和物理内存单元地址值y用y=f(x)的方式架开分隔。
   每个进程都有自己的一套独立的页表和页目录(在进程创建时建立),CPU切换进程时,只要把下一个进程的页目录表的首地址写入专用寄存器,就开始寻址该进程的代码和数据了(页目录表的首地址是领导,领导换了,下面的页目录和页表这些小头目也变成了另一套班子了)。
   对于一个进程来说,它能见到和使用的一切内存地址都是虚拟内存地址(不管访问最终目标的是在内存中,还是硬盘上),物理内存地址也就只有操作系统偶尔私自在背后把玩把玩,什么时候都不要认为你的程序中的地址是物理内存地址,它会去直接访问物理内存地址。(除非你是在做操作系统)
   在物理内存中只有一套操作系统的代码,把所有操作系统代码页的页首地址在每个进程的页表和页目录表中都抄一份,那么每个进程就可以共享同一个操作系统的代码了。
   虚拟内存地址通常绝不等于物理内存地址,隔了十万八千里,风牛马不相及。
   当然,页表和页目录表中有很多不对应物理内存页的空项,这些空项要么是程序没用到那么多的内存,要么该页放在了硬盘上,这些信息在页表项和页目录表项的指定位上有标记指示,当MMU查到这些页表项或页目录表项时,会根据标记确定是出错(因为访问了程序使用范围外的虚拟内存地址)或者调入硬盘中对应的映射页到内存并登记页表和页目录表,更改对应项的标记。
   系统并不机械地建立一个从00000000h到ffffffffh的4GB虚拟内存映射的页表和页目录表,只对那些隔三差五的使用了的虚拟地址才建立对应的页表和页目录表,否则的话,小小的内存全被一个个进程的页表和页目录填满了。
简单的说:
   Win32所指的“虚拟内存”=主板上插的内存+磁盘上的交换文件
   (以下描述均针对Win32系统)
“虚拟内存”
   “虚拟内存”是为多进程提出的一个概念,他给进程造成一种假象:每个进程都单独拥有操作系统所支持的4G最大内存(32位系统),即使你主板上实际没有那么多内存,甚至你的内存+交换文件都不足4G,所以称之为“虚拟”。
“4G地址空间”
   每个进程所拥有的4G空间是一个“地址的空间”,并不是一个已经分配了“虚拟内存”的空间,所以这个空间的大小是0,它只是一组从00000000h到ffffffffh的地址序列而已。
为地址空间分配“虚拟内存”
   进程如果想通过4G地址空间内的“地址”访问“虚拟内存”,必须通过调用操作系统的API为这些地址分配实际的“虚拟内存”,就是用那些Malloc函数去Reserve&Commit内存,这时你的进程才真正的占用到了“虚拟内存”,而具体占用的是主板上插的内存还是磁盘交换文件,这是由操作系统决定的。
    所有 32位应用程序都有 4 GB 的进程地址空间(32 位地址最多可以映射 4 GB 的内存)。对于 Microsoft Windows操作系统,应用程序可以访问 2 GB的进程地址空间,称为用户模式虚拟地址空间。应用程序拥有的所有线程都共享同一个用户模式虚拟地址空间。其余 2 GB为操作系统保留(也称为内核模式地址空间)。所有操作系统版本(从 Windows 2000 Server 开始,包括 WindowsServer 2003)都有一个 boot.ini开关,即/3gb开关项,可以为应用程序提供访问3GB的进程地址空间的权限,从而将内核模式地址空间限定为1GB。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0