逻辑地址空间和物理地址空间
CPU 生成的地址通常称为逻辑地址,而内存单元看到的地址(即加载到内存地址寄存器的地址)通常称为物理地址。
编译时和加载时的地址绑定方法生成相同的逻辑地址和物理地址。然而,执行时的地址绑定方案生成不同的逻辑地址和物理地址。在这种情况下,我们通常称逻辑地址为虚拟地址,本节我们对逻辑地址和虚拟地址不加区别。
由程序所生成的所有逻辑地址的集合称为逻辑地址空间,这些逻辑地址对应的所有物理地址的集合称为物理地址空间。因此,对于执行时地址绑定方案,逻辑地址空间与物理地址空间是不同的。
从虚拟地址到物理地址的运行时映射是由内存管理单元(MMU)的硬件设备来完成。基地址寄存器这里称为重定位寄存器。用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值(如图 1 所示)。
图 1 使用重定位寄存器的动态重定位
例如,如果基地址为 14000,那么用户对位置 0 的访问将动态地重定位为位置 14000;对地址 346 的访问将映射为位置 14346。
用户程序不会看到真实的物理地址。程序可以创建一个指向位置 346 的指针,将它保存在内存中,使用它,将它与其他地址进行比较等,所有这些都是通过 346 这样一个数字来进行。只有当它作为内存地址时(例如,在间接加载和保存时),它才会相对于基地址寄存器进行重定位。用户程序处理逻辑地址,内存映射硬件将逻辑地址转变为物理地址。所引用的内存地址只有在引用时才最后定位。
我们现在有两种不同类型的地址:逻辑地址(范围为 0〜max)和物理地址(范围为 R + 0~R + max,其中 R 为基地址的值)。用户只生成逻辑地址,且以为进程的地址空间为 0〜max。然而,这些逻辑地址在使用之前应映射到物理地址。逻辑地址空间绑定到另一单独物理地址空间的这一概念对内存的管理至关重要。
编译时和加载时的地址绑定方法生成相同的逻辑地址和物理地址。然而,执行时的地址绑定方案生成不同的逻辑地址和物理地址。在这种情况下,我们通常称逻辑地址为虚拟地址,本节我们对逻辑地址和虚拟地址不加区别。
由程序所生成的所有逻辑地址的集合称为逻辑地址空间,这些逻辑地址对应的所有物理地址的集合称为物理地址空间。因此,对于执行时地址绑定方案,逻辑地址空间与物理地址空间是不同的。
从虚拟地址到物理地址的运行时映射是由内存管理单元(MMU)的硬件设备来完成。基地址寄存器这里称为重定位寄存器。用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值(如图 1 所示)。
图 1 使用重定位寄存器的动态重定位
例如,如果基地址为 14000,那么用户对位置 0 的访问将动态地重定位为位置 14000;对地址 346 的访问将映射为位置 14346。
用户程序不会看到真实的物理地址。程序可以创建一个指向位置 346 的指针,将它保存在内存中,使用它,将它与其他地址进行比较等,所有这些都是通过 346 这样一个数字来进行。只有当它作为内存地址时(例如,在间接加载和保存时),它才会相对于基地址寄存器进行重定位。用户程序处理逻辑地址,内存映射硬件将逻辑地址转变为物理地址。所引用的内存地址只有在引用时才最后定位。
我们现在有两种不同类型的地址:逻辑地址(范围为 0〜max)和物理地址(范围为 R + 0~R + max,其中 R 为基地址的值)。用户只生成逻辑地址,且以为进程的地址空间为 0〜max。然而,这些逻辑地址在使用之前应映射到物理地址。逻辑地址空间绑定到另一单独物理地址空间的这一概念对内存的管理至关重要。
所有教程
- C语言入门
- C语言编译器
- C语言项目案例
- 数据结构
- C++
- STL
- C++11
- socket
- GCC
- GDB
- Makefile
- OpenCV
- Qt教程
- Unity 3D
- UE4
- 游戏引擎
- Python
- Python并发编程
- TensorFlow
- Django
- NumPy
- Linux
- Shell
- Java教程
- 设计模式
- Java Swing
- Servlet
- JSP教程
- Struts2
- Maven
- Spring
- Spring MVC
- Spring Boot
- Spring Cloud
- Hibernate
- Mybatis
- MySQL教程
- MySQL函数
- NoSQL
- Redis
- MongoDB
- HBase
- Go语言
- C#
- MATLAB
- JavaScript
- Bootstrap
- HTML
- CSS教程
- PHP
- 汇编语言
- TCP/IP
- vi命令
- Android教程
- 区块链
- Docker
- 大数据
- 云计算