linux 内核 - 内存管理概念
在一些允许扩展内存的计算机中,系统内存可以增加,但物理内存仍然是计算机系统中的有限资源,虚拟内存是一个概念,它给每个进程一个“幻觉”,让进程认为自己拥有很大甚至几乎无限的内存,有时比系统实际拥有的内存还多。为了说明内存管理,我们引入几个概念:地址空间、虚拟(或逻辑)地址、物理地址和总线地址。
1. 物理地址(Physical Address)
标识物理内存(RAM)的位置;由于虚拟内存机制,用户或内核通常不会直接操作物理地址,而是通过对应的逻辑地址访问它。
2. 虚拟地址(Virtual Address)
不一定在物理内存中实际存在。CPU 使用这个地址访问物理内存,由 内存管理单元(MMU, Memory Management Unit) 负责转换。MMU 位于 CPU 核心和内存之间,通常集成在物理 CPU 中(在 ARM 架构上是核心的一部分)。每次访问内存时,MMU 都会将虚拟地址转换成物理地址,这个过程称为 地址转换(Address Translation)。
3. 逻辑地址(Logical Address)
通过线性映射(linear mapping)生成的地址。是虚拟地址中相对于物理地址具有固定偏移量的部分(PAGE_OFFSET 上的映射)。所以 逻辑地址总是虚拟地址,但虚拟地址不一定是逻辑地址。
4. 总线地址(Bus Address)
总线地址是 CPU 或 DMA 控制器通过 系统总线访问内存或外设时使用的地址,它是硬件层面的寻址方式,用于在 CPU、GPU、外设和内存之间进行数据传输。对于大多数现代 CPU,总线地址和物理地址通常是 一一对应 的,但有些架构可能存在偏移或重映射。当外设通过 DMA(Direct Memory Access)访问内存时,需要使用总线地址,而不是虚拟地址。内核会负责将物理地址转换为总线地址(如果有必要),保证硬件能够正确访问内存。