MIPS 地址空间

 MIPS处理器对地址空间的使用和处理与传统的CISC CPU有着微妙的不同。
先看一些基本的原则。在MIPS CPU里,你写在程序中的地址绝不会和芯片的物理地址相同(有时变化很小,但并不相同),我们分别称之为程序地址和物理地址。
一个MIPS CPU可以运行在两种特权级之一上:用户模式和核心模式。简单来说,我们常说用户态和核心态。但是MIPS体系结构的一个特点就是从核心态到用户态的变化并不改变操作的行为,只是有时某些操作被认为是非法的。在用户态,地址最高位为一的任何程序地址都是非法的并会导致自陷。还有,有些指令在用户态将会导致异常。
在32位下(下图1.1 ),程序地址空间划分为四大区域,每个区域有一个传统的(完全没有意义的)名字。根据地址所处的区域不同,处理也不同:

useg Ox000 0000-Ox7FFF FFFF(低端2G):这些地址是用户态可用的地址。在有MMU的机器里,这些地址将一概被转换。除非MMU已经设置好,否则不应该使用这些地址。有些文档将这部分称为“useg” ,特别是在描述用户程序看到的地址空间的时候。本书不再采用“useg”。对于没有MMU的机器,这些地址的行为与具体实现机器相关。具体CPU的手册将会提供有关这方面的信息。如果想要你的代码能够移植到无MMU的处理器上,或者能够在不同的无MMU的处理器间移植,应避免使用这块区域。
kseg0 Ox8000 0000-Ox9FFF FFFF (512M):只要把最高位清零这些地址就会转换成物理地址,映射到连续的低端512M的物理地址。因为这种转换极为简单,常常称这段地址为“非转换的”的区域,但其实不然。该区域的地址几乎总是要通过高速缓存来存取,所以在高速缓存适当初始化之前,不能使用。这个区域在无MMU的系统中用来存放大多数程序和数据;在有MMU的系统中用来存放操作系统核心。
kseg1 OxA000 0000-OxBFFF FFFF (512M):这些地址通过把最高三位清零的方法来映射到物理地址,重复映射到了低端512M的物理地址。但是这一次存取不经过高速缓存。kseg1是唯一的在系统重启时能正常工作的地址空间。这也是为什么复位时的入口点(0xBFCO 0000)放在这个区域。入口点相应的物理地址是0x1FCO 0000——把这一点告诉你的硬件工程师。因此要使用这个区域去存取初始的程序ROM;大多数人也把该区用作I/O寄存器。如果硬件设计人员提议要把这些东西映射到物理内存的低512M空间之外,你得劝阻他。
kseg2 OxC000 0000-OxFFFF FFFF (1G):这块区域只能在核心态下使用并且要经过MMU的转换。在MMU设置好之前,不要存取该区域。除非你在写一个真正的操作系统,否则来说没有理由用kseg2。有时你可能会看到该区域被分成两半,分别叫做kseg2和kseg3,意在强调其低半部分(kseg2)可供运行在管理态的程序使用。

简单系统的寻址
MIPS的程序地址从来不会和物理地址简单相等。但对与简单的嵌入式软件而言可能只用kseg0和kesg1的地址,它们和物理地址有着非常简单的映射关系。
从0x2000 0000 (512M)开始向上的物理地址空间在上述简单情形下没有任何的映射,大多数简单的系统所有地址都映射到512M以下。但是如果真的需要,你可以通过设置存储器管理单元的(TLB)的方式,或者使用64位CPU的一些额外空间,来存取512M以上的物理地址。

核心与用户特权级
在核心特权级下(CPU启动时),可以作任何事情。在用户态下,2G(最高位置位的)以上的程序地址是非法的,会导致陷入异常。注意的是,如果CPU有MMU,这意味着所有的用户地址在真正到达物理地址之前必须经过MMU的转换,从而使得操作系统有能力可以防止用户程序失去控制/乱冲乱撞。同时也意味着对一个运行着没有地址转换的OS的MIPS CPU来说,用户特权级其实是多余的。
另外,在用户态下,有些指令――特别是操作系统需要的那些CPU控制指令——是非法的。
要注意的是,当你改变核心态/用户态特权级模式位时,并不改变对任何行为的解释―― 仅仅意味着某些功能在用户态下不允许了。在核心态下,CPU可以存取低位地址,就和在用户态一样,并且地址也是做同样的转换。
还要注意的是,尽管听上去好像是在说“核心态是操作系统用的,用户态是日常简单的代码用的”,但是事实与此相反。有些简单的系统(包括许多实时操作系统)全部代码都是运行在核心态下的。

你可能感兴趣的:(工作,OS,嵌入式,存储,文档)