关于地址空间:
我们知道,mips cpu有一个地址空间的描述,jz4740也有一个地址空间的map,这两者有什么区别与联系呢?
下面所讲的地址,都是程序地址。mips的程序地址和物理地址不会相等,但对于kseg0和kseg1虚拟地址和物理地址对应起来很方便。
mips cpu有用户模式与特权模式,在用户模式下,地址最高位为1的任何程序都会导致cpu的一个自陷。有些指令在用户态也会异常。
mips cpu:
0x00000000 ------- 0x80000000(2G) user space, kuseg
0x80000000 ------- 0xa0000000(512M) unmapped cached, kseg0
0x80000000 ------- 0xc0000000(512M) unmapped uncached, kseg1
0xc0000000 ------- 0xffffffff(1G) Mapped, kseg2
kuseg:用户态可见地址,在有mmu的机器中,这些地址将一概被转换。除非mmu已经被设置好,否则不应该使用这些地址。
kseg0:该区域的地址,几乎总要通过高速缓存来取,所以在告诉缓存适当初始化以前,不应该使用。这个区域在有MMU的系统中用来存放操作系统的核心。
该区域地址通过把最高位清零来映射到物理地址。低512M.
kseg1:系统重启的入口点0xbfc00000房子这个区域。入口点相应的物理地址是0x1fc00000,这是什么意思?所以我们需要这个区域来存取系统初始的rom,大多数
人也把该区域用作IO寄存器空间。该区域地址通过把最高3位清零来映射到物理地址。低512M.
kseg2:该区域只能在核心态下使用,并且要经过MMU的转换。在MMU被设置之前,不要使用。可以看出,这快区域被用来存放操作系统。
kseg0,kseg1和物理地址有非常简单的映射关系,不需要mmu转换。
程序地址就是我们送给cpu的指令中所使用的地址。我们一开始会在程序地址的0xbfc00000处,但这个地址会被cpu映射到物理地址的0x1fc00000处。
也就是说最后cpu的地址总线送出去的其实是0x1fc00000这个地址,而我们在start.S中使用的是0xbfc00000这个地址。
这个地址属于kseg2,可以直接在核心态下使用,不会被mmu转换。
阅读(972) | 评论(0) | 转发(0) |