MIPS基本地址空间

MIPS基本地址空间:

               ————《see mips run》

 

       32 位下,程序地址空间(虚拟地址)划分为4 个大区域。每个区域有一个传统的名字。对于在这些区域的地址,各自有不同的属性:
MIPS基本地址空间_第1张图片

       kuseg: 0x000 0000 - 0x7FFF FFFF (低端2G):这些地址是用户态可用的地址。在有MMU 的机器里,这些地址将一概被MMU 作转换。除非MMU 的设置被建立好,这2G 地址是不可用的。对于没有MMU 的机器,存取这2G 地址的操作与具体机器相关。你的CPU 具体厂商提供的手册将会告诉你关于这方面的信息。如果想要你的代码在有或没有MMU 的MIPS 处理器之间有兼容性,尽量避免这块区域的存取。
      kseg0: 0x8000 0000 - 0x9FFF FFFF(512M): 这些地址映射到物理地址简单的通过把最高位清零,然后把它们映射到物理地址低段512M(0x0000 0000 - 0x1FFF FFFF)。因为这种映射是很简单的,通常称之为“非转换的“地址区域。几乎全部的对这段地址的存取都会通过快速缓存(cache)。因此在cache 设置好之前,不能随便使用这段地址。通常一个没有MMU 的系统会使用这段地址作为其绝大多数程序和数据的存放位置。对于有MMU 的系统,操作系统核心会存放在这个区域。
       kseg1: 0xA000 0000 - 0xBFFF FFFF(512M): 这些地址通过把最高3 位清零的方法来映射到相应的物理地址上,与kseg0 映射的物理地址一样。但kseg1 是非cache 存取的。kseg1 是唯一的在系统重启时能正常工作的地址空间。这也是为什么重新启动时的入口向量是0xBFC0 0000。这个向量相应的物理地址是0x1FC0 0000。你将使用这段地址空间去存取你的初始化ROM。大多数人在这段空间使用I/O 寄存器。如果你的硬件工程师要把这段地址空间映射到非低段512M 空间,你得劝说他。
       kseg2: 0xC000 0000 - 0xFFFF FFFF (1G): 这段地址空间只能在核心态下使用并且要经过MMU 的转换。在MMU 设置好之前,不能存取这段区域。除非你在写一个真正的操作系统,一般来说你不需要使用这段地址空间。

 

> 一个物理地址的两个虚拟地址映射关系,不冲突.
>
 
实际上使用时并不会真的用2个不同的虚地址去映射同一个物理地址,因为这两个区域的属性不同。
kseg0是unmapping,cached;而kseg1是unmapping,uncached的,所以真正使用时kseg0一般给
内核使用,kseg1作为设备地址空间使用
,划分的话,可以各占一半,譬如在mips32里,kseg0使用
0x8000_0000到0x9000_0000;kseg1使用0xB000_0000到0xC000_0000,各256M即可。

你可能感兴趣的:(嵌入式-mips)