Devin's Blog

Diversity is essential to happiness

0%

虚拟内存技术

虚拟内存技术

虚拟内存技术

操作系统的虚拟内存管理机制起来什么作用?

一、 可以控制物理内存的访问权限。

  物理内存本身是不限制访问的,任何地址理论上来说都是可以读写的,而操作系统要求不同的页面具有不同的访问权限,这是利用CPU模式和MMU内存保护机制实现的。
  例如Test Segment被只读保护起来,防止执行了错误的指令意外改写了Test Segment,内核地址空间也被保护起来,防止在用户模式下访问内核数据或执行内核代码。
 这样错误的指令或者是恶意的代码的破坏能力受到了限制,顶多使当前进程因为段错误而终止,不会影响整个系统的稳定性。

二、可以让每一个进程都有独立的地址空间。

  不同的进程中相同的VA(virtul address)被MMU映射到不同的PA(physical adress)。所以在每一个进程中访问任何虚拟地址都是不可能访问到属于另一个进程的物理内存的页面。并且每一个进程都认为自己独占了0x0000 0000 - 0xbfff ffff 的整个用户地址空间。

  独占的好处就是,任何进程执行了错误指令或者是恶意的代码导致的非法内存访问都不会意外改写其他进程的数据,也不会影响其他进程的运行。

  打开一个终端,查看终端进程的地址空间

$ cat /proc/2668/maps
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

08048000-08124000 r-xp 00000000 08:01 262149 /bin/bash
08124000-08125000 r--p 000db000 08:01 262149 /bin/bash
08125000-0812a000 rw-p 000dc000 08:01 262149 /bin/bash
0812a000-0812f000 rw-p 00000000 00:00 0
09e01000-0a091000 rw-p 00000000 00:00 0 [heap]
b715f000-b717e000 r--p 00000000 08:01 1192977 /usr/share/locale-langpack/zh_CN/LC_MESSAGES/bash.mo
b717e000-b7189000 r-xp 00000000 08:01 1442771 /lib/i386-linux-gnu/libnss_files-2.15.so
b7189000-b718a000 r--p 0000a000 08:01 1442771 /lib/i386-linux-gnu/libnss_files-2.15.so
b718a000-b718b000 rw-p 0000b000 08:01 1442771 /lib/i386-linux-gnu/libnss_files-2.15.so
b718b000-b71a1000 r-xp 00000000 08:01 1442765 /lib/i386-linux-gnu/libnsl-2.15.so
b71a1000-b71a2000 r--p 00015000 08:01 1442765 /lib/i386-linux-gnu/libnsl-2.15.so
b71a2000-b71a3000 rw-p 00016000 08:01 1442765 /lib/i386-linux-gnu/libnsl-2.15.so
b71a3000-b71a5000 rw-p 00000000 00:00 0
b71a5000-b71ac000 r-xp 00000000 08:01 1442767 /lib/i386-linux-gnu/libnss_compat-2.15.so
b71ac000-b71ad000 r--p 00006000 08:01 1442767 /lib/i386-linux-gnu/libnss_compat-2.15.so
b71ad000-b71ae000 rw-p 00007000 08:01 1442767 /lib/i386-linux-gnu/libnss_compat-2.15.so
b71c1000-b7365000 r--p 03f51000 08:01 534160 /usr/lib/locale/locale-archive
b7365000-b7565000 r--p 00000000 08:01 534160 /usr/lib/locale/locale-archive
b7565000-b7566000 rw-p 00000000 00:00 0
b7566000-b7705000 r-xp 00000000 08:01 1442720 /lib/i386-linux-gnu/libc-2.15.so
b7705000-b7707000 r--p 0019f000 08:01 1442720 /lib/i386-linux-gnu/libc-2.15.so
b7707000-b7708000 rw-p 001a1000 08:01 1442720 /lib/i386-linux-gnu/libc-2.15.so
b7708000-b770c000 rw-p 00000000 00:00 0
b770c000-b770f000 r-xp 00000000 08:01 1442733 /lib/i386-linux-gnu/libdl-2.15.so
b770f000-b7710000 r--p 00002000 08:01 1442733 /lib/i386-linux-gnu/libdl-2.15.so
b7710000-b7711000 rw-p 00003000 08:01 1442733 /lib/i386-linux-gnu/libdl-2.15.so
b7711000-b772d000 r-xp 00000000 08:01 1442817 /lib/i386-linux-gnu/libtinfo.so.5.9
b772d000-b772f000 r--p 0001b000 08:01 1442817 /lib/i386-linux-gnu/libtinfo.so.5.9
b772f000-b7730000 rw-p 0001d000 08:01 1442817 /lib/i386-linux-gnu/libtinfo.so.5.9
b7730000-b7737000 r--s 00000000 08:01 531129 /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache
b7737000-b7741000 r-xp 00000000 08:01 1442775 /lib/i386-linux-gnu/libnss_nis-2.15.so
b7741000-b7742000 r--p 00009000 08:01 1442775 /lib/i386-linux-gnu/libnss_nis-2.15.so
b7742000-b7743000 rw-p 0000a000 08:01 1442775 /lib/i386-linux-gnu/libnss_nis-2.15.so
b7743000-b7745000 rw-p 00000000 00:00 0
b7745000-b7746000 r-xp 00000000 00:00 0 [vdso]
b7746000-b7766000 r-xp 00000000 08:01 1442700 /lib/i386-linux-gnu/ld-2.15.so
b7766000-b7767000 r--p 0001f000 08:01 1442700 /lib/i386-linux-gnu/ld-2.15.so
b7767000-b7768000 rw-p 00020000 08:01 1442700 /lib/i386-linux-gnu/ld-2.15.so
bff9d000-bffbe000 rw-p 00000000 00:00 0 [stack]

三、VA到PA的映射会给分配和释放内存带来便利

  物理地址不连续的几块内存空间也可以映射成虚拟地址连续的一块内存。比如malloc会分配一块很大的内存空间,虽然有足够多的空闲物理内存,但是却没有足够大的连续空闲内存,这个时候就可以分配多个不连续的物理页面而映射到连续的虚拟地址范围。

四、

  一个系统如果同时运行很多进程,为进程分配的内存之和可能会大于实际可用的物理内存,虚拟内存管理机制使这种情况下各种进程仍然能够正常运行。进程访问的是虚拟内存页面,这些页面数据可以保存在物理页面中,也可以零时保存在磁盘上而不占用页面的数据。
  可以在磁盘上开辟一个分区或者文件专门用于临时保存虚拟内存页面的数据,叫做交换设备(Swap Device)。启动了交换设备之后,系统可以分配内存总量是 物理内存和交换设备的大小之和。

  当物理内存不够的时候,操作系统将不常用的物理页面中的数据临时保存到交换设备。解除VA到PA的映射,这个物理页面就可以认为是空闲的。也可以重新分配给进程使用,这个过程称为Page out.