地址空间(address space)表示任何一个计算机实体所占用的内存大小。比如外设、文件、服务器或者一个网络计算机。地址空间包括物理空间以及
虚拟空间。
导读
存储器抽象
在
计算机中,每个设备以及进程都被分配了一个地址空间。处理器的地址空间由其
地址总线以及
寄存器决定。地址空间可以分为Flat——表示起始空间位置为0;或者Segmented——表示空间位置由
偏移量决定。在一些系统中,可以进行地址空间的类型转换。至于IP地址空间,IPV4协议并没有预见到IP地址的需求量如此之大,32位的地址空间已经无法满足需求了。因此,开发了
IPV6协议,支持128位的地址空间。
暴露问题
把物理地址暴露给进程会带来下面几个严重问题。第一,如果
用户程序可以寻址内存的每个
字节,它们就可以很容易地(故意地或偶然地)破坏操作系统,从而使系统慢慢地停止运行。即使在只有一个用户进程运行的情况下,这个问题也是存在的。第二,使用这种模型,想要同时(如果只有一个CPU就轮流执行)运行多个程序是很困难的。在
个人计算机上,同时打开几个程序是很常见的(一个文字处理器,一个邮件程序,一个
网络浏览器,其中一个当前正在工作,其余的在按下鼠标的时候才会被激活)。在系统中没有对
物理内存的抽象的情况下,很难做到上述情景,因此,我们需要其他办法。
概念
要保证多个
应用程序同时处于内存中并且不互相影响,则需要解决两个问题:保护和
重定位。我们来看一个原始的对前者的解决办法:给内存块标记上一个保护键,并且比较执行进程的键和其访问的每个内存字的保护键。然而,这种方法本身并没有解决后一个问题,虽然这个问题可以通过在程序被装载时
重定位程序来解决,但这是一个缓慢且复杂的解决方法。
一个更好的办法是创造一个新的内存抽象:地址空间。就像进程的概念创造了一类抽象的CPU以运行程序一样,地址空间为程序创造了一种抽象的内存。地址空间是一个进程可用于寻址内存的一套地址集合。每个进程都有一个自己的地址空间,并且这个地址空间独立于其他进程的地址空间(除了在一些特殊情况下进程需要共享它们的地址空间外)。
地址空间的概念非常通用,并且在很多场合中出现。随着数量的增长,空间变得越来越不够用了,从而导致需要使用更多位数。
地址空间可以不是数字的。
互联网域名也是地址空间。这个地址空间是由所有包含2~63个字符并且后面跟着
字符串组成的,组成这些字符串的字符可以是字母、数字和
连字符。
物理地址与虚拟地址
物理地址 (physical address): 放在寻址总线上的地址。放在寻址总线上,如果是读,电路根据这个地址每位的值就将相应地址的物理内存中的数据放到数据总线中传输。如果是写,电路根据这个地址每位的值就将相应地址的物理内存中放入数据总线上的内容。物理内存是以字节(8位)为单位编址的。
虚拟地址 (virtual address): CPU启动保护模式后,程序运行在虚拟地址空间中。注意,并不是所有的“程序”都是运行在虚拟地址中。CPU在启动的时候是运行在实模式的,内核在初始化页表之前并不使用虚拟地址,而是直接使用物理地址的。
和地址空间
物理存储器和存储地址空间是两个不同的概念。但是由于这两者有十分密切的关系,而且两者都用B、KB、MB、GB来度量其
容量大小,因此容易产生认识上的混淆,弄清这两个不同的概念,有助于进一步认识
主存储器和用好主存储器。
物理存储器是指实际存在的具体存储器芯片。如主板上装插的主存条和装载有系统的BIOS的ROM芯片,显示卡上的显示RAM芯片和装载显示BIOS的ROM芯片,以及各种
适配卡上的RAM芯片和ROM芯片都是
物理存储器。
存储地址空间是指对
存储器编码(编码地址)的范围。所谓编码就是对每一个物理
存储单元(一个字节)分配一个号码,通常叫作“
编址”。分配一个号码给一个
存储单元的目的是为了便于找到它,完成数据的读写,这就是所谓的“
寻址”(所以,有人也把地址空间称为
寻址空间)。
CPU在操控
物理存储器的时候,把物理存储器都当作内存来对待,把它们总的看作一个由若干存储单元组成的逻辑存储器,这个逻辑存储器就是我们所说的内存地址空间。
有的物理存储器被看作一个由若干存储单元组成的逻辑存储器,每个物理存储器在这个逻辑存储器中占有一个地址段,即一段地址空间。CPU在这段地址空间中读写数据,实际上就是在相对应的物理存储器中读写数据。
地址空间的大小和物理存储器的大小并不一定相等。举个例子来说明这个问题:某层楼共有17个房间,其编号为801~817。这17个房间是物理的,而其地址空间采用了三位编码,其范围是800~899共100个地址,可见地址空间是大于实际房间数量的。
对于386以上档次的微机,其
地址总线为32位,因此地址空间可达2的32次方,即4GB。但实际上我们所配置的
物理存储器通常只有1MB、2MB、4MB、8MB、16MB、32MB等,远小于地址空间所允许的范围。
IPv6地址空间
IPv6是
下一代互联网协议。现有的互联网是在IPv4的基础上运行的,随着互联网的迅速发展,IPv4定义的有限地址(
IP地址)空间将被耗尽,必将影响互联网的进一步发展。IPv4采用32位地址长度,只有大约43亿个地址,估计在2009~2010年间将被分配完毕。IPv6重新定义地址空间,采用128位地址长度,几乎可以不受限制地提供地址,保守估计IPv6实际可分配的地址,整个地球每平方米面积上就可分配1000多个地址。
除了地址空间巨大之外,IPv6还具有这几方面的优势:无状态自动配置,网络更加安全,服务质量更好。
Linux进程的虚拟地址空间
在x86体系结构中分段机制是必选的,而分页机制则可由具体的操作系统而选择,Linux通过让段的基地址为0而巧妙的绕过了基地址。因此,对于Linux来说,虚地址和线性地址是一致的。在32位的平台上,线性地址的大小为固定的4GB。并且,由于采用了保护机制,Linux内核将这4GB分为两部分,虚地址较高的1GB(0xC0000000到0xFFFFFFFF)为共享的内核空间;而较低的3GB(0x00000000到0xBFFFFFFF)为每个进程的用户空间。由于每个进程都不能直接访问内核空间,而是通过系统调用间接进入内核,因此,所有的进程都共享内核空间。而每个进程都拥有各自的用户空间,各个进程之间不能互相访问彼此的用户空间。因此,对于每一个具体的进程而言,都拥有4GB的虚拟地址空间。