参考:
总线地址、物理地址、虚拟地址-CSDN博客
内存管理:物理地址、虚拟地址、逻辑地址_虚拟地址和物理地址-CSDN博客
总线地址
总线地址和地址总线是一个概念。地址总线 (Address Bus;又称:位址总线) 属于一种电脑总线 (一部份),是由CPU 或有DMA 能力的单元,用来沟通这些单元想要存取(读取/写入)电脑内存元件/地方的实体位址。是CPU能够访问内存的范围。
例如:
- 比如一个32位的win7系统,其内存8G,但是系统最大往往只能识别3.29G,只有使用64位系统才可以全部完整的内存。其原因就是:32位操作系统CPU的访问范围是2^32 bit(4,234,967,296bit),约等于3.9G(1 gbit = 1024 mbit = 1024^2 kbit = 1024^3 bit)
- 树莓派也是32位 ,一个G的内存,但它只能访问949M,剩下的另作他用
- CPU寻找外部的内存单元靠的是地址总线传输的数据
- 寻址能力就是计算CPU能寻找多少个内存单元
- 地址总线决定了cpu所能访问的最大内存空间的大小
- 地址总线是地址线数量之和
物理地址
指的是硬件的实际地址(绝对地址):在存储器(硬盘)里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址
虚拟地址
虚拟地址的具体描述形式是逻辑地址,虚拟地址是基于算法的;软件层面的;“假”的地址。
Windows程序时运行在386保护模式下,这样程序访问存储器所使用的逻辑地址称为虚拟地址,与实地址模式下的分段地址类似,虚拟地址也可以写为“段:偏移量”的形式,这里的段是指段选择器。而linux没有这种保护模式,本来用的就是虚拟地址。
Q:既然已经有了物理地址,为什么还要有虚拟地址?
A: 如果没有虚拟地址的话:当多个程序要并发执行时,这些程序的数据需要同时放到内存,为了区分这些程序,需要给内存的存储地址编号成物理地址,然要将进程和物理地址映射起来就可以成功并发运行了。
听起来似乎确实不需要虚拟地址了,但是实际中内存可能只有一个G,而进程可能有很多,总量很可能超过一个G,也就是说内存作为一个有限的资源很有可能被立刻占满。所以,直接将进程和物理地址映射是行不通的。
此时,就需要虚拟地址。先将进程与虚拟地址映射起来,再将虚拟地址与物理地址映射起来,就可以实现多个进程对于内存的共用,使得超过内存大小的程序也可以顺利运行。
基于总线/物理/虚拟地址理解 树莓派芯片外设
可以使用“cat /proc/cpuinfo”查看树莓派的芯片型号,我使用的是树莓派3B+,芯片版本是BCM2835:
BCM2835芯片手册:
- BCM2835是ARM-cotexA53架构
- 00000000~FFFFFFFF是CPU寻址的范围,就是4,294,967,296 bit,约4个G;虚拟地址也有4个G,而物理地址只有1个G
- DMA是高速拷贝单元,CPU可以发动DMA直接让DMA进行数据拷贝,直接内存访问单元