(一)地址的概念
1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中
很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、
BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,
这个物理地址被放到CPU的地址线上。
物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,
因此在32 bits地址线的x86处理器中,物理地址空间是2的32次方,即4GB,但物理RAM一般
不能上到4GB,因为还有一部分要给总线用(总线上还挂着别的 许多设备)。在PC机中,
一般是把低端物理地址给RAM用,高端物理地址给总线用。
2)总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,
CPU使用的是物理地址。
物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上,物理地址就是总线地址,
这是因为它们共享相同的地址空间——这句话有点难理解,详见下 面的“独立编址”。在其他平台上,
可能需要转换/映射。比如:CPU需要访问物理地址是0xfa000的单元,那么在x86平台上,
会产生一个PCI总线 上对0xfa000地址的访问。因为物理地址和总线地址相同,所以凭眼睛
看是不能确定这个地址是用在哪儿的,它或者在内存中,或者是某个卡上的存储单元,
甚至可能这个地址上没有对应的存储器。
3)虚拟地址:现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,
这需要MMU(Memory Management Unit)的支持。MMU通常是CPU的一部分,如果处理器没有MMU,
或者有MMU但没有启用,CPU执行单元发出的内存地址将直接传到芯片引脚上,被 内存芯片
(物理内存)接收,这称为物理地址(Physical Address),如果处理器启用了MMU,
CPU执行单元发出的内存地址将被MMU截获,从CPU到MMU的地址称为虚拟地址(Virtual Address),
而MMU将这个地址翻译成另一个地址发到CPU芯片的外部地址引脚上,也就是将虚拟地址映射
成物理地址。
Linux中,进程的4GB(虚拟)内存分为用户空间、内核空间。用户空间分布为0~3GB(
即PAGE_OFFSET,在0X86中它等于 0xC0000000)
,剩下的1G为内核空间。程序员只能使用虚拟地址。系统中每个进程有各自的私有用
户空间(0~3G),这个空间对系统中的其他进程是不可见的。
CPU发出取指令请求时的地址是当前上下文的虚拟地址,MMU再从页表中找到这个虚拟地址