名词解释:arm内存空间、arm地址空间与arm物理内存

看过了一些资料,感觉这三个名词容易混淆,以下是我自己的理解。

arm与powerpc两种处理器跟x86不同,arm与powerpc一样,它们的外设I/O端口是统一编址的,即与物理内存等外设统一编址在4GB的地址空间中(32为处理器)。而x86是将内存单独编址在一个地址空间,外设I/O端口在另外的地址空间,要访问IO地址空间需要用专门的指令操作。


因此,“arm内存空间”这种说法是有很大歧义的。到底是实际的物理内存的空间还是arm内核的所有寻址空间。很多csdn blog上的“arm内存空间”的实际意思都是指arm的物理寻址空间,即4GB。


回到linux的虚拟地址与物理地址的问题。linux的每个进程都有4GB的虚拟地址空间,其中1~3GB是每个进程独占的用户空间,3GB~4GB是所有进程共享的内核空间(0xC0000000~0xFFFFFFFF)。因此虚拟地址空间包括内核空间与用户空间。内核空间作为虚拟地址,是如何跟实际的物理地址产生关系的呢?这就是有MMU来完成这件事情了。linux的实虚地址的转换就是有MMU通过页表的形式完成转换的。linux系统将arm的“物理内存”线性映射到内核空间中。当物理内存的地址空间小于内核空间时,内核空间的低地址空间将物理内存一一线性映射(0xC0000000~high memory),内核空间多出来的虚拟地址空间用来做I/O端口内存映射。当然实际应用中内核空间不可能将物理地址空间“全部霸占”,否则用户空间没有物理地址可用了。这就限制了驱动程序与应用程序的量级,也因此内存大小是制约系统性能的重要因素。当物理内存的地址空间大于内核空间时,系统通过设置的宏来使得high memory成为一个固定小于0xFFFFFFFF的数值,从而内核空间可以留出一部分虚拟地址空间用来进行IO内存映射使用,而实际的物理内存也由于high memory较小而多出空余的内存来,这些内存就可以为系统用来做高端内存使用。

你可能感兴趣的:(名词解释:arm内存空间、arm地址空间与arm物理内存)