龙芯2Fcpu内部物理地址的转换

在经过TLB或者特有机制之后,虚拟地址被转化成物理地址。这个物理地址是不能被外设直接使用的,要经过一些转化。
    对于龙芯,32位的地址使用现在只残存于bios中。内核都是使用64bit的地址。
在经过cpu的cache和tlb转换后,cpu-core出来的地址(就是我们常说的物理地址)还要经过一层转化。
   cpu的地址转换靠的是4个cpu窗口。其中win0,win2是给DDR2映射的,win1,win3是给pci/localio映射的。
   每个win都有3个寄存器组成,base,mask,mmap.其中win0和win1一般是使用开机默认的,win0默认的base为0,mask表征大小为256MB,mmap为0,win1的base为0x1000_0000,mask表征大小为256MB,mmap为0x1000_0001,mmap的末尾为0表示映射到DDR2,为1表示映射到pci或者cpu的内部资源(pmon,interrupt,uart等)。在bios中,只使用默认的前面两个窗口,所以在bios中只能使用256MB内存,256MB的pci空间(实际是192MB),另外的win2,win3在内核代码中设置在arch/mips/lemote/lm2f/common/pci.c中和
arch/mips/lemote/lm2f/common/pci.c中的那些内嵌汇编就是了。
   设置寄存器的起始地址是0x900000003ff00000,这个地址属于XKPHY段,地址的解析规则在2Fcpu的手册上表述为”对XKPHY的访问不经过TLB进行地址变换,而是将虚拟地址的bit0~bit39作为物理地址,bit59~bit61控制是否通过cache和cache的一致性属性。“0x900000003ff00000,可见这个9是用于一致性属性标识的,实际地址反正是0x3ff00000。这个地址在512M~1G内。实际上物理地址在512M和1G之间是非常特殊的。这个区域的地址不在任一cpu窗口内,实际上设置cpu窗口的寄存器就在这个地址范围。应该是特殊处理的了。
在setup.c中设置了win2,设置基地址为0x0000000080000000,大小2G,mmap也是2G(可见龙芯2F最大支持2G内存,这个段和win0是冲突的,这个通过add_memory_region(0x90000000, highmemsize << 20, BOOT_MEM_RAM);这句来解决,就是把程序地址搞成从0x90000000开始,这样留出win0占用的256MB,就不冲突了)。
    在pci.c中设置了win3,base为0x40000000,大小1G,mmap为0x40000001。就是高内存部分。
好了。这是物理地址经过的第一次转换,如果转换后的地址末尾为0,发往DDR2模块,否则发往另一条路。

你可能感兴趣的:(龙芯2Fcpu内部物理地址的转换)