
关于虚拟地址的一些理解
首先很重要的一点:虚拟地址空间不等于Windows下的虚拟内存!!!!!
关于这两个概念相信包括我在内的好多人都会混淆。
1.虚拟地址的由来
ps:参考自<程序员的自我修养>
我们知道,CPU是并发执行多个程序的,在运行多个程序时。一个明显的问题是:如何将计算机上有限的物理内存分配给多个程序使用。
假设我们计算机有128MB内存,程序A、B、C运行分别需要10MB、100MB、20MB。那么比较直接的做法就是把内存的前10MB分配给程序A,10MB~110MB分配给程序B。这样就能够实现A和B两个程序同时运行,但是这种简单得内存分配策略问题很多:
① 地址空间不隔离:所有程序都直接访问物理内存,恶意的程序可以容易改写其它程序的内存数据。
② 内存使用效率低:如果上面的例子中我们突然要运行程序C,那么只能把B换出磁盘,然后把C读入到内存开始运行。可以看到整个过程中有大量的数据换入换出,导致效率非常低下。
③ 程序运行的地址不确定: 程序每次装入运行时,在内存分配的地址是不确定的,但是在程序编写时,它访问数据和指令跳转时的目标地址很多都是固定的。
因此,现代计算机引入了虚拟存储器(Vitual Memory,也叫虚拟地址空间)的概念,它是对物理内存的一种抽象。虚拟地址空间是虚拟的,每个进程都有自己独立的虚拟空间。
ps:以前一直在纠结虚拟地址空间到底是实现的(而且一度认为每个进程都会在硬盘中分配一段空间来存储 ╮(╯▽╰)╭),后来发现进程只是维护一个mm_struct结构(具体实现我也不懂啦)。
2.虚拟地址跟物理地址的转换
ps:程序中使用的一般都为虚拟地址(如malloc返回的地址)
每个进程都有固定大小的虚拟地址空间(32位的地址空间大小为4GB)。通过虚拟地址跟物理地址的转换技术,我们通过操作虚拟地址来使用物理地址,并且可以解决我们上面提出的三个问题:
① 通过给虚拟地址(设置标志位?)对物理内存进行隔离
② 通过分页技术可以把防止大量的数据换入换出
③ 通过访问固定的虚拟地址来访问不确定的物理地址
(关于虚拟地址跟物理地址的转换(通过MMU)相信网上随便都能搜到啦 ╮(╯▽╰)╭)




近期评论