进程的虚拟地址空间
2012-04-16 13:06
309 查看
进程的虚拟地址空间
每个进程都被赋予它自己的虚拟地址空间。对于3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x 0 0 0 0 0 0 0 0至0 x F F F F F F F F之间的任何一个值。这使得一个指针能够拥有4 294 967 296个值中的一个值,它覆盖了一个进程的4 G B虚拟空间的范围。对于6 4位进程来说,这个地址空间是1
6 E B(1 01 8字节),因为6 4位指针可以拥有从0 x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0至0 x F F F F F F F F F F F F F F F F之间的任何值。这使得一个指针可以拥有18 446 744 073 709 551 616个值中的一个值,它覆盖了一个进程的1 6 E B虚拟空间的范围。这是相当大的一个范围。
由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。
注意在Windows 2000中,属于操作系统本身的内存也是隐藏的,正在运行的线程无法访问。这意味着线程常常不能访问操作系统的数据。Windows 98中,属于操作系统的内存是不隐藏的,正在运行的线程可以访问。因此,正在运行的线程常常可以访问操作系统的数据,也可以破坏操作系统(从而有可能导致操作系统崩溃)。在Windows
98中,一个进程的线程不可能访问属于另一个进程的内存。
前面说过,每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0 x 1 2 3 4 5 6 7 8,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0 x 1 2 3 4 5 6 7 8。当进程A中运行的线程访问地址为0 x 1 2 3 4 5 6 7 8的内存时,这些线程访问的是进程A的数据结构。当进程B中运行的线程访问地址为0
x 1 2 3 4 5 6 7 8的内存时,这些线程访问的是进程B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构。反之亦然。
当你因为拥有如此大的地址空间可以用于应用程序而兴高采烈之前,记住,这是个虚拟地址空间,不是物理地址空间。该地址空间只是内存地址的一个范围。在你能够成功地访问数据而不会出现违规访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。本章后面将要具体介绍这是如何操作的。
虚拟地址空间如何分区
每个进程的虚拟地址空间都要划分成各个分区。地址空间的分区是根据操作系统的基本实现方法来进行的。不同的Wi n d o w s内核,其分区也略有不同。表 1显示了每种平台是如何对进程的地址空间进行分区的。
表1 进程的地址空间如何分区
[align=left]3 2位Windows 2000的内核与6 4位Windows 2000的内核拥有大体相同的分区,差别在于分区的大小和位置有所不同。另一方面,可以看到Windows 98下的分区有着很大的不同。下面让我们看一下系统是如何使用每一个分区的。[/align]
每个进程都被赋予它自己的虚拟地址空间。对于3 2位进程来说,这个地址空间是4 G B,因为3 2位指针可以拥有从0 x 0 0 0 0 0 0 0 0至0 x F F F F F F F F之间的任何一个值。这使得一个指针能够拥有4 294 967 296个值中的一个值,它覆盖了一个进程的4 G B虚拟空间的范围。对于6 4位进程来说,这个地址空间是1
6 E B(1 01 8字节),因为6 4位指针可以拥有从0 x 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0至0 x F F F F F F F F F F F F F F F F之间的任何值。这使得一个指针可以拥有18 446 744 073 709 551 616个值中的一个值,它覆盖了一个进程的1 6 E B虚拟空间的范围。这是相当大的一个范围。
由于每个进程可以接收它自己的私有的地址空间,因此当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存。属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。
注意在Windows 2000中,属于操作系统本身的内存也是隐藏的,正在运行的线程无法访问。这意味着线程常常不能访问操作系统的数据。Windows 98中,属于操作系统的内存是不隐藏的,正在运行的线程可以访问。因此,正在运行的线程常常可以访问操作系统的数据,也可以破坏操作系统(从而有可能导致操作系统崩溃)。在Windows
98中,一个进程的线程不可能访问属于另一个进程的内存。
前面说过,每个进程有它自己的私有地址空间。进程A可能有一个存放在它的地址空间中的数据结构,地址是0 x 1 2 3 4 5 6 7 8,而进程B则有一个完全不同的数据结构存放在它的地址空间中,地址是0 x 1 2 3 4 5 6 7 8。当进程A中运行的线程访问地址为0 x 1 2 3 4 5 6 7 8的内存时,这些线程访问的是进程A的数据结构。当进程B中运行的线程访问地址为0
x 1 2 3 4 5 6 7 8的内存时,这些线程访问的是进程B的数据结构。进程A中运行的线程不能访问进程B的地址空间中的数据结构。反之亦然。
当你因为拥有如此大的地址空间可以用于应用程序而兴高采烈之前,记住,这是个虚拟地址空间,不是物理地址空间。该地址空间只是内存地址的一个范围。在你能够成功地访问数据而不会出现违规访问之前,必须赋予物理存储器,或者将物理存储器映射到各个部分的地址空间。本章后面将要具体介绍这是如何操作的。
虚拟地址空间如何分区
每个进程的虚拟地址空间都要划分成各个分区。地址空间的分区是根据操作系统的基本实现方法来进行的。不同的Wi n d o w s内核,其分区也略有不同。表 1显示了每种平台是如何对进程的地址空间进行分区的。
表1 进程的地址空间如何分区
分区 | 32位Windows 2000(x86和Alpha处理器) | 32位Windows 2000(x86w/3GB用户方式) | 64位Windows 2000(Alpha和IA-64处理器) | Windows 98 |
N U L L指针分配的分区 | 0 x 0 0 0 0 0 0 0 0 0 x 0 0 0 0 F F F F | 0 x 0 0 0 0 0 0 0 0 0 x 0 0 0 0 F F F F | 0x00000000 00000000 0x00000000 0000FFFF | 0 x 0 0 0 0 0 0 0 0 0 x 0 0 0 0 0 F F F |
DOS/16位Windows应用程序兼容分区 | 无 | 无 | 无 | 0 x 0 0 0 0 0 1 0 0 0 0 x 0 0 3 F F F F F |
用户方式 | 0 x 0 0 0 1 0 0 0 0 0 x 7 F F E F F F F | 0 x 0 0 0 1 0 0 0 0 0 x B F F E F F F F F | 0x00000000 00010000 0x000003FF FFFEFFFF | 0 x 0 0 4 0 0 0 0 0 0 x 7 F F F F F F F |
64-KB | 0 x 7 F F F 0 0 0 0 | 0 x B F F F 0 0 0 0 | 0 x 0 0 0 0 0 3 F F F F F F 0 0 0 0 | 无 |
禁止进入 | 0 x 7 F F F F F F F | 0 x B F F F F F F F | 0 x 0 0 0 0 0 3 F F F F F F F F F F | 无 |
共享内存映射 | 无 | 无 | 无 | 0 x 8 0 0 0 0 0 0 0 |
文件(MMF)内核方式 | 0 x 8 0 0 0 0 0 0 0 0 0 x F F F F F F F F | 0 x C 0 0 0 0 0 0 0 0 x F F F F F F F F | 0x00000400 00000000 0xFFFFFFFFF FFFFFFF | 0 x B F F F F F F F 0 x C 0 0 0 0 0 0 0 0 x F F F F F F F F |
相关文章推荐
- 【C语言】【unix c】使用mmap将文件映射到进程的虚拟地址空间,然后对内存的操作直接反应到文件中
- 进程的虚拟地址空间,堆栈、堆、数据段、代码段
- linux和windows的进程的虚拟地址空间
- 进程的虚拟地址空间,堆栈、堆、数据段、代码段
- 进程虚拟地址空间的划分
- 进程地址空间和虚拟地址空间
- linux和windows的进程的虚拟地址空间
- 进程虚拟地址空间之数据分区存放
- 进程虚拟地址空间 程序编译链接过程
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- 进程的虚拟地址空间,堆栈、堆、数据段、代码段
- 进程虚拟地址空间与物理内存关系
- Linux进程全解2——进程环境(环境变量、进程运行的虚拟地址空间)
- 进程的虚拟地址空间,堆栈、堆、数据段、代码段
- 关于Windows编程中进程虚拟地址空间/虚拟内存及内存映射方面的资料
- Chap-6 6.4 进程虚拟地址空间分布
- 关于进程的4GB虚拟地址空间概念的理解
- 内存管理分析之一:Linux进程空间与虚拟地址的好处
- 进程用户态虚拟地址空间上限测试