免费论文网 首页

物理内存2g虚拟内存

时间:2017-05-20 10:04 来源:免费论文网

篇一:虚拟内存与物理内存

虚拟内存与物理内存扫盲(转)

2008-03-01 23:08

Windows 2000 使用基于分页机制的虚拟内存。每个进程有4GB的虚拟地址空间。基于分页机制,这4GB地址空间的一些部分被映射了物理内存,一些部分映射硬盘上的交换文件,一些部分什么也没有映射。程序中使用的都是4GB地址空间中的虚拟地址。而访问物理内存,需要使用物理地址。

下面我们看看什么是物理地址,什么是虚拟地址。

物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如

果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。

虚拟地址 (virtual address): 4G虚拟地址空间中的地址,程序中使用的都是

虚拟地址。

如果CPU寄存器中的分页标志位被设置,那么执行内存操作的机器指令时,CPU

会自动根据页目录和页表中的信息,把虚拟地址转换成物理地址,完成该指令。比如 mov eax,004227b8h ,这是把地址004227b8h处的值赋给寄存器的汇编代

码,004227b8这个地址就是虚拟址。CPU在执行这行代码时,发现寄存器中的分页标志位已经被设定,就自动完成虚拟地址到物理地址的转换,使用物理地址取出值,完成指令。对于Intel CPU 来说,分页标志位是寄存器CR0的第31位,为1表示使用分页,为0表示不使用分页。对于初始化之后的 Win2k 我们观察 CR0 ,发现第31位为1。表明Win2k是使用分页的。

使用了分页机制之后,4G的地址空间被分成了固定大小的页,每一页或者被映

射到物理内存,或者被映射到硬盘上的交换文件中,或者没有映射任何东西。对于一般程序来说,4G的地址空间,只有一小部分映射了物理内存,大片大片的

部分是没有映射任何东西。物理内存也被分页,来映射地址空间。对于32bit

的Win2k,页的大小是4K字节。CPU用来把虚拟地址转换成物理地址的信息存放在叫做页目录和页表的结构里。

物理内存分页,一个物理页的大小为4K字节,第0个物理页从物理地址

0×00000000 处开始。由于页的大小为4KB,就是0×1000字节,所以第1页从物理地址 0×00001000 处开始。第2页从物理地址 0×00002000 处开始。可以看到由于页的大小是4KB,所以只需要32bit的地址中高20bit来寻址物理页。

页表,一个页表的大小为4K字节,放在一个物理页中。由1024个4字节的页表项组成。页表项的大小为4个字节(32bit),所以一个页表中有1024个页表项。页表中的每一项的内容(每项4个字节,32bit)高20bit用来放一个物理页的物理地址,低12bit放着一些标志。

页目录,一个页目录大小为4K字节,放在一个物理页中。由1024个4字节的页

目录项组成。页目录项的大小为4个字节(32bit),所以一个页目录中有1024

个页目录项。页目录中的每一项的内容(每项4个字节)高20bit用来放一个页表(页表放在一个物理页中)的物理地址,低12bit放着一些标志。

对于x86系统,页目录的物理地址放在CPU的CR3寄存器中。

CPU把虚拟地址转换成物理地址:

一个虚拟地址,大小4个字节(32bit),包含着找到物理地址的信息,分为3个

部分:第22位到第31位这10位(最高10位)是页目录中的索引,第12位到

第21位这10位是页表中的索引,第0位到第11位这12位(低12位)是页内

偏移。对于一个要转换成物理地址的虚拟地址,CPU首先根据CR3中的值,找到页目录所在的物理页。然后根据虚拟地址的第22位到第31位这10位(最高的

10bit)的值作为索引,找到相应的页目录项(PDE,page directory entry),页目

录项中有这个虚拟地址所对应页表的物理地址。有了页表的物理地址,根据虚拟地址的第12位到第21位这10位的值作为索引,找到该页表中相应的页表项

(PTE,page table entry),页表项中就有这个虚拟地址所对应物理页的物理地址。最后用虚拟地址的最低12位,也就是页内偏移,加上这个物理页的物理地址,

就得到了该虚拟地址所对应的物理地址。

一个页目录有1024项,虚拟地址最高的10bit刚好可以索引1024项(2的10

次方等于1024)。一个页表也有1024项,虚拟地址中间部分的10bit,刚好索

引1024项。虚拟地址最低的12bit(2的12次方等于4096),作为页内偏移,刚好可以索引4KB,也就是一个物理页中的每个字节。

一个虚拟地址转换成物理地址的计算过程就是,处理器通过CR3找到当前页目录所在物理页,取虚拟地址的高10bit,然后把这10bit右移2bit(因为每个页目

录项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处

PDE(4个字节),就找到了该虚拟地址对应页表所在物理页,取虚拟地址第12

位到第21位这10位,然后把这10bit右移2bit(因为每个页表项4个字节长,右移2bit相当于乘4)得到在该页中的地址,取出该地址处的PTE(4个字节),就找到了该虚拟地址对应物理页的地址,最后加上12bit的页内偏移得到了物理地址。

32bit的一个指针,可以寻址范围0×00000000-0xFFFFFFFF,4GB大小。也就是

说一个32bit的指针可以寻址整个4GB地址空间的每一个字节。一个页表项负责4K的地址空间和物理内存的映射,一个页表1024项,也就是负责1024*4k=4M

的地址空间的映射。一个页目录项,对应一个页表。一个页目录有1024项,也

就对应着1024个页表,每个页表负责4M地址空间的映射。1024个页表负责

1024*4M=4G的地址空间映射。一个进程有一个页目录。所以以页为单位,页目

录和页表可以保证4G的地址空间中的每页和物理内存的映射。

每个进程都有自己的4G地址空间,从 0×00000000-0xFFFFFFFF 。通过每个进

程自己的一套页目录和页表来实现。由于每个进程有自己的页目录和页表,所以每个进程的地址空间映射的物理内存是不一样的。两个进程的同一个虚拟地址处

(如果都有物理内存映射)的值一般是不同的,因为他们往往对应不同的物理页。

4G地址空间中低2G,0×00000000-0×7FFFFFFF 是用户地址空间,4G地址空间中高2G,

0×80000000-0xFFFFFFFF 是系统地址空间。访问系统地址空间需要程序有

ring0的权限。

========================================================

4G地址空间的分类及其作用:

0x00000000 至 0x0000FFFF : 是为NULL指针分配而保留的,如果访

问该区域内存将导致"非法访问"错误;

0x00010000 至 0x7FFEFFFF : 是用户进程空间exe文件与dll文件的会

被加载到这部分地址空间,其中exe文

件的起始地为:0x00400000。如果访问

该区域中没有代码装入的地址将导致

"非法访问"错误;

0x7FFF0000 至 0x7FFFFFFF : 是保留区域,对此区域的任何访问都将

导致"非法访问"错误;

0x80000000 至 0xFFFFFFFF : 仅供操作系统使用,用于加载设备驱动

程序和其它核心级代码。从用户级应用

程序(ring 3)访问此区域将导致"非法访问"错误;

页目录和页表结构(转) 2008-03-01 23:14 页目录和页表结构

上图反映了如下信息:

1、 进程的4G 线性空间被划分成三个部分:进程空间(0-3G)、内核直接映射空间(3G – high_memory)、内核动态映射空间(VMALLOC_START - VMALLOC_END)

2、 三个空间使用同一张页目录表,通过 CR3 可找到此页目录表。但不同的空间在页目录

表中页对应不同的项,因此互相不冲突

3、 内核初始化以后,根据实际物理内存的大小,计算出 high_memory、VMALLOC_START、VMALLOC_END 的值。并为“内核直接映射”空间建立好映射关系,所有的物理内存都可以通过此空间进行访问。

4、 “进程空间”和“内核动态映射空间”的映射关系是动态建立的(通过缺页异常) 假设在有三个线性地址 addr1, addr2, addr3 ,分别属于三个线性空间,但是最终都映射到物理页面1:

1、 三个地址对应不同的页表和页表项

2、 但是页表项的高 20bit 肯定是1,表示物理页面的索引号是1 10000 H 第20痊

3、 同时,根据高 20 bit,可以从 mem_map[] 中找到对应的 struct page 结构,struct page 用于管理实际的物理页面(红线)

4、 从线性地址,根据页目录表,页表,可以找到物理地址

5、 Struct page 和物理地址之间很容易互相转换

6、 从物理地址,可以很容易的反推出在内核直接映射空间的线性地址(蓝线)。要想得到在进程空间或者内核动态映射空间的对应的线性地址,则需要遍历相应的“虚存区间”链表。

关于页目录表:

1、 每个进程有一个属于自己的页目录表,可通过 CR3 寄存器找到

2、 而内核也有一个独立于其它进程的页目录表,保存在 swapper_pg_dir[] 数组中

3、 当进程切换的时候,只需要将新进程的页目录把地址加载到 CR3 寄存器中即可

4、 创建一个新进程的时候,需要为它分配一个 page,作为页目录表,并将

swapper_pg_dir[] 的高 256 项拷贝过来,低 768 项则清0

页目录和页表结构(转) 2008-03-01 23:14 页目录和页表结构

篇二:虚拟内存与物理内存的地址映射解析

在进入正题前先来谈谈操作系统内存管理机制的发展历程,了解这些有利于我们更好的理解目前操作系统的内存管理机制。 一 早期的内存分配机制

在 早期的计算机中,要运行一个程序,会把这些程序全都装入内存,程序都是直接运行在内存上的,也就是说程序中访问的内存地址都是实际的物理内存地址。当计算机同时运行多个程序时,必须保证这些程序用到的内存总量要小于计算机实际物理内存的大小。那当程序同时运行多个程序时,操作系统是如何为这些程序分配内存 的呢?下面通过实例来说明当时的内存分配方法:

某台计算机总的内存大小是 128M ,现在同时运行两个程序 A 和 B , A 需占用内存 10M , B 需占用内存 110 。计算机在给程序分配内存时会采取这样的方法:先将内存中的前 10M 分配给程序 A ,接着再从内存中剩余的 118M 中划分出 110M 分配给程序 B 。这种分配方法可以保证程序 A 和程序 B 都能运行,但是这种简单的内存分配策略问题很多。

图一 早期的内存分配方法

问题 1 :进程地址空间不隔离。由于程序都是直接访问物理内存,所以恶意程序可以随意修改别的进程的内存数据,以达到破坏的目的。有些非恶意的,但是有 bug 的程序也可能不小心修改了其它程序的内存数据,就会导致其它程序的运行出现异常。这种情况对用户来说是无法容忍的,因为用户希望使用计算机的时候,其中一个任务失败了,至少不能影响其它的任务。

问题 2 :内存使用效率低。在 A 和 B 都运行的情况下,如果用户又运行了程序 C ,而程序 C 需要 20M 大小的内存才能运行,而此时系统只剩下 8M 的空间可供使用,所以此时系统必须在已运行的程序中选择一个将该程序的数据暂时拷贝到硬盘上,释放出部分空间来

供程序 C 使用,然后再将程序 C 的数据全部装入内存中运行。可以想象得到,在这个过程中,有大量的数据在装入装出,导致效率十分低下。

问题 3 :程序运行的地址不确定。当内存中的剩余空间可以满足程序 C 的要求后,操作系统会在剩余空间中随机分配一段连续的 20M 大小的空间给程序 C 使用,因为是随机分配的,所以程序运行的地址是不确定的。

二 分段

为 了解决上述问题,人们想到了一种变通的方法,就是增加一个中间层,利用一种间接的地址访问方法访问物理内存。按照这种方法,程序中访问的内存地址不再是实际的物理内存地址,而是一个虚拟地址,然后由操作系统将这个虚拟地址映射到适当的物理内存地址上。这样,只要操作系统处理好虚拟地址到物理内存地址的映 射,就可以保证不同的程序最终访问的内存地址位于不同的区域,彼此没有重叠,就可以达到内存地址空间隔离的效果。

当创建一个进程时,操作系统会为该进程分配一个 4GB 大小的虚拟 进程地址空间。之所以是 4GB ,是因为在 32 位的操作系统中,一个指针长度是 4 字节,而 4 字节指针的寻址能力是从 0x00000000~0xFFFFFFFF ,最大值 0xFFFFFFFF 表示的即为 4GB 大小的容量。与虚拟地址空间相对的,还有一个物理地址空间,这个地址

空间对应的是真实的物理内存。如果你的计算机上安装了 512M 大小的内存,那么这个物理地址空间表示的范围是

0x00000000~0x1FFFFFFF 。当操作系统做虚拟地址到物理地址映射时,只能映射到这一范围,操作系统也只会映射到这一范围。当进程创建时,每个进程都会有一个自己的 4GB 虚拟地址空间。要注意的是这个 4GB 的地址空间是“虚拟”的,并不是真实存在的,而且每个进程只能访问自己虚拟地址空间中的数据,无法访问别的进程中的数据,通过这种方法实现了进程间的地址隔离。那是不是这 4GB 的虚拟地址空间应用程序可以随意使用呢?很遗憾,在 Windows 系统下,这个虚拟地址空间被分成了 4 部分: NULL 指针区、用户区、 64KB 禁入区、内核区。应用程序能使用的只是用户区而已,大约 2GB 左右 ( 最大可以调整到 3GB) 。内核区为 2GB ,内核区保存的是系统线程调度、内存管理、设备驱动等数据,这部分数据供所有的进程共享,但应用程序是不能直接访问的。

人 们之所以要创建一个虚拟地址空间,目的是为了解决进程地址空间隔离的问题。但程序要想执行,必须运行在真实的内存上,所以,必须在虚拟地址与物理地址间建立一种映射关系。这样,通过映射机制,当程序访问虚拟地址空间上的某个地址值时,就相当于访问了物理地址空间中的另一个值。人们想到了一种分段

(Sagmentation) 的方法,它的思想是在虚拟地址空间和物理地址空间之间做一一映射。比如说虚拟地址空间中某个 10M 大小的空间映射到物理地址空间中某个 10M 大小的空间。这种思想理解起来并不

难,操作系统保证不同进程的地址空间被映射到物理地址空间中不同的区域上,这样每个进程最终访问到的

物理地址空间都是彼此分开的。通过这种方式,就实现了进程间的地址隔离。还是以实例说明,假设有两个进程 A 和 B ,进程 A 所需内存大小为 10M ,其虚拟地址空间分布在 0x00000000 到

0x00A00000 ,进程 B 所需内存为 100M ,其虚拟地址空间分布为 0x00000000 到 0x06400000 。那么按照分段的映射方法,进程 A 在物理内存上映射区域为 0x00100000 到 0x00B00000 ,,进程 B 在物理内存上映射区域为 0x00C00000 到 0x07000000 。于是进程 A 和进程 B 分别被映射到了不同的内存区间,彼此互不重叠,实现了地址隔离。从应用程序的角度看来,进程 A 的地址空间就是分布在 0x00000000 到 0x00A00000 ,在做开发时,开发人员只需访问这段区间上的地址即可。应用程序并不关心进程 A 究竟被映射到物理内存的那块区域上了,所以程序的运行地址也就是相当于说是确定的了。 图二显示的是分段方式

的内存映射方法。

篇三:Ramdisk虚拟内存盘应该占多少物理内存?

Ramdisk虚拟内存盘应该占多少物理内存?Ramdisk虚拟内存盘软件可以将榨干内存的潜在性能,但一个问题来了,Ramdisk虚拟内存盘要占用多少物理内存才算合适?经过小编的摸索研究,终于得到的一个较为靠谱的结论,大家可以根据小编的建议来折腾。

不知道Ramdisk怎么用的朋友,请先阅读《将内存当硬盘用!Primo Ramdisk图文教程》。

Ramdisk应该占用多少物理内存?

如果是2G内存,那建议挪300-500M内存分割给Ramdisk,更建议升级到4G内存以上;

如果是3G内存,建议挪0.7-1G内存给Ramdisk;

如果是4G内存,建议挪1-1.5G内存给Ramdisk;

如果是6G以上,建议挪50%内存给Ramdisk。

Ramdisk

应该占多少内存?(点击图片查看大图)

怎么样才叫好好利用Ramdisk的空间?

如果Ramdisk大于700M时,可以考虑安装各种软件进去,从我们日常上网需求来看,浏览器应该是使用最多的工具,其次是QQ等。浏览器和QQ是最占系统资源的,他们快了,那你感觉电脑就会快了。而输入法等软件对系统要求超级低,可以在Ramdisk足够大时才安装到Ramdisk里。具体请参考以下表格。

怎么利用Ramdisk

注:要将软件安装到Ramdisk里,记得设定关机保存。否则重启之后就得重新安装一次软件。

写在最后

内存越来越大已经成为一个趋势,如果不好好利用这些内存,那就意味着浪费,而Ramdisk则是最适合普通用户用来榨干内存潜能的最佳工具。用好Ramdisk,无需SSD也能享受极速的快感!


物理内存2g虚拟内存
由:免费论文网互联网用户整理提供,链接地址:
http://m.csmayi.cn/meiwen/40739.html
转载请保留,谢谢!
相关阅读
最近更新
推荐专题