用户程序在运行时不希望介入到这些复杂的存储器管理过程中,作为普通的程序,它需要的是一个简单的执行环境,有一个单一的地址空间、有自己的CPU,好像整个程序占有整个计算机而不用关心其它的程序(当然程序间通信的部分除外,因为这是程序主动要求跟其它程序通信和联系)。
所谓的地址空间是个比较抽象的概念,你可以把它想象成一个很大的数组,每个数组的元素是一个字节,而这个数组大小由地址空间的地址长度决定,比如32bit的地址空间的大小为 2^32 = 4294967296 byte,即4GB,地址空间有效的地址是0 ~ 4294967295 , 用十六进制表示为 0x 0000 0000 ~ 0x ffffFFFF。
地址空间分两种:虚拟地址空间(Virtual Address Space)和物理地址空间(Physical Address Space)。
物理地址空间是实实在在存在的,存在于计算机中,而且对于每一台计算机来说只有唯一的一个,你可以把物理地址空间想象为物理内存,比如:你的计算机用的是Intel 的 Pentium4 的CPU,那么它是32bit的机器,即计算机地址线有32条(实际上是36条地址线,不过我们暂时认为它只是32条),那么物理地址空间就有4GB。 但是你的计算机上只装了 512MB的内存,那么其实物理地址的真正有效部分只有 0x 0000 0000 ~ 0x1FFFffff,其他部分都是无效的(实际上还有一些外部I/O设备映射到物理空间的,也是有效的,但是我们暂时无视其存在)。
虚拟地址空间是指虚拟的、人们想象出来的地址空间,其实他并不存在,每个进程都有自己独立的虚拟空间,而且每个进程只能访问自己的地址空间,这样就有效地做到了进程隔离。
2^32 = 4294967296 = 0x1 0000 0000
2^31 = 2147483648 = 0x 8000 0000
1 KiB = 2^10 byte = 1024 byte (0x0 ~ 0x 400)
1 MiB = 1024 X 1 KiB = 2 ^ 10 X 2 ^10 byte = 2 ^20 byte (0x0 ~ 0x 10 0000)
1 GiB = 1024 X 1 Mib = 2^10 X 1 MiB = 2^10 X 2^20byte = 2^30 bye(0x 0 ~0x4000 0000)
512MB 的地址空间 (1GB/2)所以 2^30 /2 = 2^29 = 0x 4000 0000 /2 = 0x 2000 0000
能够表示的地址 0x 0000 0000 ~ 0x1FFFffff
在32位x86 CPU的Linux中 最多访问4GB 空间 2^32 ,内核态只能访问 最高的1GB内存空间
0xc0000000以上的地址空间只能在内核态下访问,0x00000000至0xbfffffff的地址空间在两种状态下都可以访问。(注意:这里所说的地址空间是逻辑地址而不是物理地址)。