mips基本地址空间

相关基本概念:

  1. 物理地址: 内存的实际地址。
    总线地址 : axi,ahb,apb等系统总线上的地址,通常总线地址等于逻辑地址。
    虚拟地址:cpu看到的地址。

  2. mips cpu可以运行在两种特权级别上 : 用户态和核心态。也就是用户模式和核心模式。
    从核心态切换到用户态,MIPS CPU做的工作并没有不同,只是有时是非法的。在用户态,任何一个地址的首地址是非法的,就会引起陷阱异常。另外,在用户态下,一些指令也会引起异常。在核心模式下,cpu可以做任何事情。在用户模式下,程序地址超过2GB之上是非法的产生一个陷阱。

    mips的内核模式和用户模式可以通过cp0寄存器进行配置,具体配置方法参考下图:
    mips基本地址空间_第1张图片

  3. mapped : 物理地址到虚拟地址转换需要使用tlb
    unmapped : 物理地址到虚拟地址转换不需要使用tlb

下图是mips地址空间划分:

mips基本地址空间_第2张图片
kuseg : 0x00000000~0x7fffffff(2G),这一段空间,为User Space,可以在User Mode下访问,当然,在Kernel Mode下也是可以访问的。程序在访问User Space的内存时,会通过MMU的TLB,映射到实际的物理地址上。也就是说,这一段逻辑地址空间和物理地址空间的对应关系,是由MMU中的TLB表项 决定的。内核空间的copy_to_user和cppy_from_user会访问到这个空间。

kseg0 : 0x80000000~0x9fffffff(512MB), 这段空间虚拟地址转物理地址的方法是把最高位清零。虚拟地址连续映射到物理内存的低512MB。访问这段物理空间不需要tlb转换,会经过cache。通常bootloader和kernel会使用这块空间。

kseg1 : 0xa0000000~0xbfffffff(512MB), 这段空间虚拟地址转物理地址的方法是把高三位清零。虚拟地址连续映射到物理内存的低512MB。访问这段物理空间不需要tlb转换,不会经过cache。由于使用前不需要初始化tlb和cache,所以这块空间在系统启动时可以直接使用,mips启动入口就设在了kseg1的0x1fc00000。通常I/O空间也设在kseg1。

kseg2和kseg3 : 0xc0000000~0xffffffff(1GB),访问这段物理空间需要tlb转换,会经过cache。通过vmalloc申请的内存地址在这段空间,连续的虚拟地址映射到非连续的物理地址。

下图是内核模式下虚拟地址到物理地址的映射关系图

mips基本地址空间_第3张图片

几点解释和说明:

  1. kseg0和kseg1都直接映射到物理地址的低512MB。在这段空间,物理地址和虚拟地址都是连续的。
  2. useg和kseg2 kseg3的物理地址需要通过tlb转换得到。在这些空间,虚拟地址是连续的,物理地址是非连续的。
  3. 物理地址0x00000000~0x10000000 和 0x20000000~0x30000000对应DDR的低256M。
  4. 物理地址的0x10000000~0x20000000(256M)通常给I/O控制器使用。
  5. 如果想使用DDR大于256M的空间,需要使能kernel的高端内存,并且使用vmalloc申请空间。(如果没使能高端内存,vmalloc申请到的空间仍然是低256MB)。
  6. 内核API的virt_to_phys和phys_to_virt只能用于直接映射的地址空间,也就是虚拟地址0x80000000~0xbfffffff。
  7. 个人认为上图中的物理地址叫做总线地址或者逻辑地址更合适一些。我习惯于只把DDR的地址称作物理地址。



作者声明:本文是作者学习总结,能力有限,难免出现问题,如发现问题会及时修改。如有侵权,联系本人删除。

你可能感兴趣的:(mips)