精华内容
下载资源
问答
  • MIPS体系架构

    2010-12-06 09:58:00
    MIPS体系结构首先是一种RISC架构 1 MIPS32架构中有32个通用寄存器,其中$0(无论你怎么设置,这个寄存器中保存的数据都是0)和$31(保存函数调用jal的返回地址)有着特殊的用途,其它的寄存器可作为通用寄存器用于...
    MIPS体系结构首先是一种RISC架构
    1 MIPS32架构中有32个通用寄存器,其中$0(无论你怎么设置,这个寄存器中保存的数据都是0)和$31(保存函数调用jal的返回地址)有着特殊的用途,其它的寄存器可作为通用寄存器用于任何一条指令中。
    虽然硬件没有强制性的指定寄存器使用规则,在实际使用中,这些寄存器的用法都遵循一系列约定。这些约定与硬件确实无关,但如果你想使用别人的代码,编译器 和操作系统,你最好是遵循这些约定。
    寄存器编号 助记符 用法
    0 zero 永远返回值为0
    1 at 用做汇编器的暂时变量
    2-3 v0, v1 子函数调用返回结果
    4-7 a0-a3 子函数调用的参数
    8-15 t0-t7
    24-25 t8-t9 暂时变量,子函数使用时不需要保存与恢复
    16-25 s0-s7 子函数寄存器变量。子函数必须保存和恢复使用过的变量在函数 返回之前,从而调用函数知道这些寄存器的值没有变化。
    26,27 k0,k1 通常被中断或异常处理程序使用作为保存一些系统参数
    28 gp 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern" 变量。
    29 sp 堆栈指针
    30 s8/fp 第9个寄存器变量。子函数可以用来做桢指针
    31 ra 子函数的返回地
    2 MIPS32中如果有FPA(浮点协处理器),将会有32个浮点寄存器,按汇编语言的约定为$f0~$f31,MIPS32中只能实用偶数号的浮点寄存器,奇数号的用途是:在做双精度的浮点运算时,存放该奇数号之前的偶数号浮点寄存器的剩余无法放下的32位。比如在做双精度的浮点运算时,$1存放$0的剩余的部分,所以在MIPS32中可以通过加载偶数号的浮点寄存器而把64位的双精度数据加载到两个浮点寄存器中,每个寄存器存放32位。
    比如:
    l.d $02, 24(t1)
    被扩充为两个连续的寄存器加载:
    lwc1 $f0, 24(t1)
    lwc1 $f1, 28(t1)
    3 MIPS架构中没有X86中的PC(程序计数)寄存器,它的程序计数器不是一个寄存器。因为在MIPS这样具有流水线结构的CPU中,程序计数器在同一时刻可以有多个给定的值,如
    jal指令的返回地址跟随其后的第二条指令。
    ...
    jal printf
    move $4, $6
    xxx # return here after call
    MIPS32中也没有条件码,比如在X86中常见的状态寄存器中的Z、C标志位在MIPS32中是没有的,但是MIPS32中是有状态寄存器
    4 MIPS32中不同于其它的RISC架构的地方是其有整数乘法部件,这个部件使用两个特殊的寄存器HI、LO,并且提供相应的指令 mfhi/mthi,mthi/mtlo来实现整数乘法结果--hi/lo寄存器与通用寄存器之间的数据交换
    5 数据加载与存储
    MIPS CPU可以在一个单一操作中存储1到8个字节。文档中和用来组成指令助记符的 命名约定如下:
    C名字 MIPS名字 大小(字节) 汇编助记符
    long long dword 8 "d"代表ld
    int/long word 4 "w"代表lw
    short halfword 2 "h"代表lh
    char byte 1 "b"代表lb
    5.1数据加载
    包括这样几条记载指令LB/LBU、LH/LHU、LW
    byte和short的加载有两种方式。带符号扩展的lb和lh指令将数据值存放在32位寄存器的低位中,剩下的高位用符号位的值来扩充(位7如果是一个byte,位15如果是一 个short)。这样就正确地将一个带符号整数放入一个32位的带符号的寄存器中。
    不带符号指令lbu和lhu用0来扩充数据,将数据存放纵32位寄存器的低位中,并将高位用零来填充。
    例如,如果一个byte字节宽度的存储器地址为t1,其值为0xFE(-2或254如果是非符
    号数),那么将会在t2中放入0xFFFFFFFE(-2作为一个符号数)。t3的值会是0x000000FE(254作
    为一个非符号数)
    lb t2, 0(t1)
    lbu t3, 0(t1)
    5.2数据存储
    包括这样几条指令SB、SH、SW
    由于加载就是把寄存器中的数据加载到内存中,所以不存在位扩展的问题。
    6 CP0 (协处理器0)--MIPS处理器控制
    用于控制和设置MIPS CPU,里面包含了一些寄存器,同过对这些寄存器的不同的位的操作可以实现对处理器的设置
    CP0类似于X 86只能有内核 (高优先级权限)访问的一些处理器资源
    而前面提到的通用寄存器GPR和FPR则可以有由所有的优先级权限访问
    CP0提供了中断异常处理、内存管理(包括CACHE、TLB)、外设管理等途径(而这些只能由高优先级的内核才能访问到)。
    6.1常见的MIPS CPU控制寄存器包括:
    SR( 状态寄存器) 12
    Config (CPU参数设置寄存器)-16
    EPC (例外程序寄存器)13、 CAUSE(导致中断和异常的原因寄存器) 14、BadVaddr(地址错误时存放地址的寄存器)8
    Index-0、Random-1、EntryLo0-2、EntryLo1-3、EntryHi-10、PageMask
    Count-9、Compare-11共同组成了高精度的时钟
    6.2CP0寄存器的访问指令
    mtc0 ts, #把通用寄存器 ts中的数据送到协处理器0中的寄存器nn
    mfc0 ts, #把送到协处理器0中寄存器 nn 的值送到通用寄存器ts
    dmtc0 ts, #把通用寄存器 ts中的数据送到协处理器0中的寄存器nn
    dmfc0 ts, #把送到协处理器0中寄存器 nn 的值送到通用寄存器ts
    6.3起作用的寄存器及其作用时机
    加电后:你需要设置SR和Config寄存器,以确保CPU进入正确的引导状态,并且SR寄存器还设置了中断码。以决定系统响应哪些中断。
    进入任何异常:处理任何例外都会调用一个“通用异常处理程序”。MIPS体系并没有为进入异常作任何的寄存器保存,也没有关于堆栈方面的任何支持,进入异常时唯一保存的就是异常返回地址保存在EPC中。所以这些都需要操作系统的软件实现。操作系统可以使用K0或者K1寄存器作为堆栈指针,指向某个位置,并且在需要保存的寄存器保存到这个栈上。然后通过Cause寄存器找到发生异常的原因,这样才能跳转到对应的中断处理程序中。
    从异常返回:从异常返回到EPC制定的地址之前要把CPU的状态回复到异常之前,好象什么事情都没有发生一样。在R3000中使用rfe指令作这样的事情,但是着条指令仅仅恢复了一些寄存器中的内容,但是并没有转移控制指令,你需要把EPC内容保存到一个通用寄存器中,然后调用jr指令返回到EPC指向的地址处,
    7 MIPS的存储管理模型
    MIPS32中的存储器模型被划分为四个大块,其中:
    0x0000,0000~0x7fff,ffff(0~2G-1) USEG
    must be mapped (set page table and TLB)and set cache before use
    0x8000,0000~0x9fff,ffff(2G~2.5G-1) KSEG0
    directly mapped(no need to set page table and TLB) but need to set cache before use
    0xa000,0000~0xbfff,ffff(2.5G~3G-1) KSEG1
    directly mapped(no need to set page table and TLB) and never use cache
    0xc000,0000~0xffff,ffff(3G~4G-1) KSEG2
    muse be mapped(set page table and TLB) and set cache before use
    这样的存储器管理模型和X86差距比较大,X86有一个实模式,内核在启动保护模式之前,运行在实模式之下,直到设定了保护模式之后才能运行在保护模式下。在MIPS32中没有保护模式那么系统是如何启动的呢?
    MIPS32中的系统启动向量位于KSEG1中0xbf10,0000,由于KSEG1是directly mapped的,所以直接对应了物理地址0x1fc0,0000,你可以在内核中一直使用0xa000,0000~0xbfff,ffff之间的虚拟地址来访问物理地址0~512M-1,在设置了KSEG0的cache之后,也可一使用0x8000,0000~0x9fff,ffff之间的虚拟地址来访问0~512M-1之间的物理地址。对于512M以上的物理地址只能由KSEG2和USEG通过页表访问。
    8 MIPS32中的状态寄存器SR
    状态寄存器来设置处理器的一些功能集合,包括设置
    设置协处理器0~3的可用性的位CU0~CU3(28~31)
    复位向量BEV
    中断屏蔽位8~15
    KUc、IEc0~1,基本的CPU保护单位
    KUc为1时表示运行在内核态,为0时运行在用户模式。在内核态下,可以访问所有的地址空间和协处理器0,运行在用户态下值只能访问0x0000,0000~0x7fff,ffff之间的地址空间。
    KUp、IEp2~3
    当异常发生时,硬件把KUc、IEc的值保存到KUp、IEp中,并且将KUc、IEc设置为[1,0]--内核态、关中断。异常返回时 rfe指令可以把KUp、IEp的内容复制到KUc、IEc中
    KUo、IEo
    当异常发生时,硬件把KUp、IEp的值保存到KUo、IEo中;返回时把KUo、IEo的内容复制到KUp、IEp中。
    上面三对KU/IE位构成了深度2的栈,异常发生时,硬件自动压栈,rfe指令从异常返回时,从栈中恢复数值
    还有一些其它的功能和状态位,可以参考相应的文档
    9 MIPS32中的Cause寄存器
    BD位:EPC中正常情况下存放了发生异常的指令,但是当着条指令存放在调转指令的延迟槽中时,那么EPC中存放的是这个跳转指令,否则这条跳转指令将得不到执行。
    IP位:告诉用户来临的中断
    ExcCode:这是一个5位的代码,告诉你哪一条异常发生了,可以根据这个从通用异常处理程序跳装到特定异常处理程序中。
    10 MIPS32的C语言中参数传递和返回值的约定
    caller至少使用16bytes 堆栈空间存放参数,然后把这16 bytes存放到通用寄存器a0~a3中, called subroutine 直接使用寄存器中的参数,同时caller 堆栈中的16bytes的数据可以不去理会了。
    需要理解的是带有浮点参数和结构体的参数传递,对于带有浮点参数的传递需要看第一个参数是否是浮点,如果是浮点则将参数放到 $f12和$f14这两个浮点寄存器中,如果第一个参数不是浮点数,则不用浮点寄存器存放参数。对于结构体的参数传递和x86类似
    对于整数和指针类型的

     

    展开全文
  • mips体系架构介绍和一些函数backtrace的实现,包括中文书籍see mips run.pdf
  • 目前MIPS和ARMv6 体系架构中,对一级高速缓存都是使用VIPT方式,所以都要求4个页大小的对齐方式。 shmat对应的sys_shmat系统调用在内核中对请求有固定地址映射时的处理方式就是:如果体系架构使用VIPT方式,那么就...

         

            最近在进行criu zdtm单项测试 ./test/zdtm.py run -t zdtm/transition/ipc 时,测试失败。分析ipc.c用例发现,ipc测试实例功能是父进程创建了2个子进程,并通过信号量和子进程共享一个内存空间并进行数据交互。测试失败点在criu restore过程中,子进程对共享内存的虚拟地址映射无法对应上criu dump之前的地址,定位到criu 调用函数newaddr = shmat(shm,oldaddr,0)时,返回的地址newaddr不等于oldaddr所致。

           为了排查问题,我写了一个小测试实例,核心代码如下:

    /* 创建一个共享内存对象并返回共享内存标识符 */
    shm = shmget(key, shmem_size, 0777 | IPC_CREAT | IPC_EXCL); 
    
    /* 把共享内存区对象映射到调用进程的地址空间 */
    mem = shmat(shm, NULL, 0); 
    
    printf("line(%s): mem=%p\n",__LINE__,mem);
    
    /*把共享内存区对象映射到调用进程的固定地址空间 */
    mem = shmat(shm, mem, SHM_RND | SHM_REMAP); 
    
    printf("line(%s): mem=%p\n",__LINE__,mem);

    key和shmem_size可以随便生成和指定,通常shmem_size为当前系统页大小PAGE_SIZE的整数倍即可。上述代码某一次执行结果如下:

    line(128):  mem=0xfff5e9c000
    line(133):  mem=0xfff5e80000

             可以看到使用第一次使用shmat(shm,NULL,0)映射出来的虚拟地址为0xfff5e9c000,这个地址是PAGE_SIZE的整数倍(当前系统PAGE_SIZE为16K)。第二次使用shmat(shm, mem, SHM_RND | SHM_REMAP),这里mem为0xfff5e9c000,映射出来的虚拟地址为0xfff5e80000,而不是我所期望的0xfff5e9c000。而且这个地址0xfff5e80000是SHMLBA的整数倍,SHMLBA定义在内核代码arch/mips/include/asm/shmparam.h里。

               SHMLBA是什么?这就引出一个知识点,CPU 高速缓存cache的组织方式:VIVT(Virtual Index Virtual Tag) 、VIPT(Virtual Index Physical Tag)、PIPT(Physical Index Physical Tag)。这3种方式可以参考https://blog.csdn.net/hx_op/article/details/89244618

                使用VIVT和VIPT组织方式的cache都存在高速缓存别名的问题。就是如果两个不同的cache line索引指向同一个物理内存地址,那么改变别名中的一个就可能导致命中失败或者全部从写。为了克服此问题,内核中在对进程间共享内存的使用SHMLBA(4个页大小)对齐的页渲染方式。目前MIPS和ARMv6 体系架构中,对一级高速缓存都是使用VIPT方式,所以都要求4个页大小的对齐方式。

    shmat对应的sys_shmat系统调用在内核中对请求有固定地址映射时的处理方式就是:如果体系架构使用VIPT方式,那么就要求SHMLBA对齐,代码如下:

    long do_shmat(int shmid, char __user *shmaddr, int shmflg,
    	      ulong *raddr, unsigned long shmlba)
    {
           ...
    	if (addr) {
    		if (addr & (shmlba - 1)) {
    			if (shmflg & SHM_RND) {
    				addr &= ~(shmlba - 1);  /* round down */
    
    				/*
    				 * Ensure that the round-down is non-nil
    				 * when remapping. This can happen for
    				 * cases when addr < shmlba.
    				 */
    				if (!addr && (shmflg & SHM_REMAP))
    					goto out;
    			} else
    #ifndef __ARCH_FORCE_SHMLBA
    				if (addr & ~PAGE_MASK)
    #endif
    					goto out;
    		}
    
    		flags |= MAP_FIXED;

    在MIPS中SHMLBA的定义在内核代码arch/mips/include/asm/shmparam.h里,具体如下:

    #define __ARCH_FORCE_SHMLBA	1
    #define SHMLBA 0x40000	/* attach addr a multiple of this */

             由此可知,上面0xfff5e9c000不是0x40000的整数倍,即非0x40000对齐。所以shmat(shm,0xfff5e9c000, SHM_RND | SHM_REMAP)返回地址不是0xfff5e9c000。内核会在进程堆区重新找一块同大小的区域,且此区域的起始地址为0x40000对齐,并把此起始地址返回,此处为0xfff5e80000。

     

     

     

     

    展开全文
  • 最近在翻译一个core文件,在查看函数调用栈的时候,看到好多mips架构下的汇编指令,恰好在网上看到这个,顺道记下来,大家共享 一: MIPS寄存器别名记忆: 这一段在学习MIPSCPU架构,一直对mips的32个寄存器的 ...

    最近在翻译一个core文件,在查看函数调用栈的时候,看到好多mips架构下的汇编指令,恰好在网上看到这个,顺道记下来,大家共享

    一: MIPS寄存器别名记忆:
    这一段在学习MIPSCPU架构,一直对mips的32个寄存器的
    约定俗成的别名感到迷惑,今天在系统计算机研究所的网
    (http://www.xtrj.org/)上看到一篇文章里有这方面的介
    绍,一下子豁然开朗原来这里的v,a,t前缀就是英文单词
    的缩写呀。(呵呵,以前害得俺在>书上
    都没有找到有助于理解的介绍)
    ;REGISTER NAME USAGE
    $0 $zero 常量0(constant value 0)
    $2-$3 v 0 − v0- v0v1 函数调用返回值(values for results and expression evaluation)
    $4-$7 a 0 − a0- a0a3 函数调用参数(arguments)
    $8-$15 t 0 − t0- t0t7 暂时的(或随便用的)
    $16-$23 s 0 − s0- s0s7 保存的(或如果用,需要SAVE/RESTORE的)(saved)
    $24-$25 t 8 − t8- t8t9 暂时的(或随便用的)
    $28 $gp 全局指针(Global Pointer)
    $29 $sp 堆栈指针(Stack Pointer)
    $30 $fp 帧指针(Frame Pointer)
    $31 $ra 返回地址(return address)
    二: MIPS 存储空间分配
    MIPS将存储空间分为4块分别是:
    kuseg, kseg0,kseg1 and kseg2

    1. 0xFFFF FFFF mapped kseg2
    2. 0xC000 0000 unmapped uncached kseg1
    3. 0xA000 0000 unmapped cached kseg0
    4. 0x8000 0000 2G kuseg
      呵呵可以直观的看到只有kseg1是不需要映射(物理虚拟转换),没有被缓存
      的,也就是说只有kseg1的内存区域可以做引导的存储区(在这里放置引导用
      flash存储器).被cached区域必须等到MMU 的TLB被初始化后才可以使用的。
      三: MIPS的CPU运行有3个态
    5. User Mode.
    6. Supervisor Mode.
    7. and Kernel Mode.
      For simplicity, let’s just talk about User Mode and Kernel Mode.
      Please always keep this in mind:
      CPU can ONLY access kuseg memory area when running in User Mode
      CPU MUST be in kernel mode or supervisor mode when visiting kseg0, kseg1
      and kseg2 memory area。
      呵呵,可以看出MIPS的CPU运行态和x86尤其是ARM基本都是一样的。就是用户层
      对物理空间地址的访问是也是受限制的(现代操作系统的先进之处吗),必须通过使
      用驱动方式把操作代码运行在核心态。
      四: MMU TLB
      MIPS CPU通过TLB来translates all virtual addresses generated by the CPU.
      下面谈谈ASID(Address Space Identifier). Basically, ASID, plus the VA(Vir
      tual Address) are composed of the primary key of an TLB entry. 换句话说,
      虚拟 地址本身是不能唯一确定一个TLB entry的。一般而言,ASID的值就是相应的
      process ID. Note that ASID can minimized TLB re-loads, since several TLB
      entries can have the same virtual page number, but different ASID’s. 对
      于一个多任务操 作系统来讲,每个任务都有 自己的4G虚拟空间
      五: MMU 控制寄存器
      对于一个Kernel Engineer来说,对MMU的处理主要是通过MMU的一些控制寄存器来完成
      的。MIPS体系结构中集成了一个叫做System Control Coprocessor (CP0)的部件。CP0
      就是我们常说的MMU控制器。在CP0中,除了TLB entry(例如,对RM5200,有48pair,96
      个TLB entry),一些控制寄存器提供给OS KERNEL来控制MMU的行为。
      每个CP0控制寄存器都对应一个唯一的寄存器号。MIPS提供特殊的指令来对CP0进行操作。
      mfc0 reg. CP0_REG
      mtc0 reg. CP0_REG
      我们通过上述的两条指令来把一个GPR寄存器的值assign给一个CP0寄存器,从而达到
      控制MMU的目的。
      面简单介绍几个与TLB相关的CP0控制寄存器。
      Index Register
      这个寄存器是用来指定TLB entry的,当你进行TLB读写的时候。我们已经知道,例如,
      MIPS R5提供了48个TLB pair,所以index寄存器的值是从0到47。换句话说,每次TLB写
      的行为是对一个pair发生的。这一点是与其他的CPU MMU TLB 读写不同的。
      EntryLo0, EntryLo1
      这两个寄存器是用来specify 一个TLB pair的偶(even)和奇(odd)物理(Physical)页面
      地址。
      一定要注意的是:
      EntryLo0 is used for even pages; EntryLo1 is used for odd pages.
      Otherwise, the MMU will get exception fault.
      Entry Hi
      Entry Hi寄存器存放VPN2,或一个TLB的虚拟地址部分。注意的是:ASID value也是在
      这里被体现。
      Page Mask
      MIPS TLB提供可变大小的TLB地址映射。一个PAGE可以是4K,16K,64K,256K,1M,4M
      或16M。这种可变PAGE SIZE提供了很好的灵活性,特别是对Embedded System Software.
      对于Embedded System Softare,一个很大的区别就是:不允许大量的Page Fault.
      这一点是传统OS或General OS在Embedded OS上的致命缺陷。也是为什么POSIX 1。B的
      目的所在。传统OS存储管理的一个原则就是:Page On Demand.这对大多Embedded
      System是不允许的。 For embedded system,往往是需要在系统初始化的时刻就对所有的
      存储进行configuration, 以确保在系统运行时不会有Page Fault.
      上述几个寄存器除了MAP一个虚拟页面之外,还包括设置一个页面的属性。其中包括:
      writable ornot; invalide or not; cache write back or write through
      下面简单谈谈MIPS的JTLB。
      在MIPS中,如R5000, JTLB is provided. JTLB stands for Joint TLB. 什么意思呢?
      就是 TLB buffer中包含的mixed Instruction and Data TLB 映射。有的CPU的Instruction
      TLB 和Data TLB buffer 是分开的。
      当然MIPS(R5000)确实还有两个小的,分开的Instruction TLB和Data TLB。但其大小很小。
      主要是为了Performance,而且是对系统软件透明的。
      在这里再谈谈MMU TLB和CPU Level 1 Cache的关系。
      我们知道,MIPS,或大多数CPU,的Level 1 Cache都是采用Virtually Indexed and P
      hysicall tagged. 通过这个机制,OS就不需要在每次进程切换的时候去flush CACHE。
      为什么呢?
      举一个例子吧:
      进程A的一个虚拟地址Addr1,其对应的物理地址是addre1;
      进程B的一个虚拟地址Addr1,其对应的物理地址是addre2;
      在某个时刻,进程A在运行中,并且Addr1在Level 1 CACHE中。
      这时候,OS does a context swith and bring process B up, having process A sleep.
      Now, let’s assume that the first instruction/data fetch process B does is to
      access its own virtual address Addr1.
      这时候CPU会错误的把进程A在Level 1中的Addr1的addr1返回给CPU吗?
      我们的回答应该是:不会的。
      原因是:
      当进程切换时,OS会将进程B的ASID或PID填入ASID寄存器中。请记住:对TLB的访问,
      (ASID VPN)才是Primary Key. 由于MIPS的CACHE属性是Virtually Indexed,
      Physically tagged.所以,任何地址的访问,CPU都会issue the request to MMU for
      TLB translation to get the correct physical address, which then will be used
      for level cache matching.
      与此同时,CPU会把虚拟地址信号传给Level 1 Cache 控制器。然后,我们必须等待MMU
      的Physical Address数据。只有physical tag也 匹配上了,我们才能说一个:Cache Hit.
      所以,我们不需要担心不同的进程有相同的虚拟地址的事情。
      弟兄们可以重温一下我们讲过的Direct Mapped; Full Associative, and Set Associative.
      从而理解为什么Cache中可以存在多个具有相同虚拟地址的entry. For example,the above
      Addr1 for proccess A and Addr1 for process B.
    展开全文
  • 本系列文档的初衷是结合着Linux kernel的多种应用场景介绍MIPS体系架构,通过这样的方式能够看清楚MIPS处理器是如何运行Linux kernel的,其中也会多少涉及到Linux kernel相关的知识,所以需要对Linux kernel有...

    本系列文档的初衷是结合着Linux kernel的多种应用场景介绍MIPS体系架构,通过这样的方式能够看清楚MIPS处理器是如何运行Linux kernel的,其中也会多少涉及到Linux kernel相关的知识,所以需要对Linux kernel有一定的了解,如果了解其他架构,比如ARMX86等,那么看这系列文章会比较容易理解的.可能有人对于这样的介绍方式不是特别理解,很多资料,包括MIPS官方文档介绍方式都是以章节按部就班的介绍,的确,那种介绍方式能够介绍的很全面,但是初次接触MIPS架构的人还是不能理解其中的细节在现实中是如何使用的,比如举个简单的例子,当MIPS处理器执行一条用户空间的指令时,异常和MMU是如何参与其中?所以不想以那种传统方式来介绍,而是以在应用的过程中,根据需要来介绍相关的知识点 .

    对于系统软件开发人员来说,想了解MIPS的体系结构,需要涉及的内容有很多,到目前为止,MIPS发布了两个系列(32bit64bit)6个版本的处理器架构(分别对应R1-R6),这些不同的版本中,基本上都会包括pipeline,通用寄存器,协处理器CP0,中断与异常,MMUCACHEdebugFPU,指令集.近几年为了满足一些特殊需要MIPS又发布了一些特殊用途的模块标准,比如多线程(multthreadind)模块,虚拟化(virtualization)模块,除了上面这些内容,ABI也是软件开发人员不可忽略的一部分.

    上面提到的内容这么多,我们挑选其中比较简单的一个MIPS版本进行介绍,北京君正的xburst架构是采用了MIPS32 R2的规范所研发的一种架构,这个架构完全兼容MIPS32 R2,所以我们以此介绍MIPS32 R2的结构,由于该版本中不支持multthreadingvirtualization模块,所以我们不会涉及这两部分内容,MIPS64相关的内容这里也不会涉及到.

    如果发现文中的内容存有片面性的或者不准确的地方,非常欢迎发邮件到sjiwei@163.com沟通交流,谢谢.

    MIPS官网:

    架构相关:https://imgtec.com/MIPS/

    软件开发相关:https://community.imgtec.com/developers/MIPS/

    展开全文
  • MIPS架构资料

    2018-09-06 17:09:54
    看MIPS跑LINUX-MIPS体系结构剖析,对于深入理解mips架构思想很有用的。中文版
  • 文章目录1、参考2、MIPS介绍和设计理念2.1、介绍2.2、设计理念3、MIPS体系架构4、MIPS汇编基础4.1、MIPS SIMD架构(MSA)4.2、MIPS数据类型4.3、MIPS指令格式4.4、MIPS指令风格4.5、MIPS寄存器4.5.1、MIPS32寄存器 ...
  • 文章目录1、参考资料2、MIPS介绍和设计理念2.1、介绍2.2、设计理念3、MIPS体系架构4、MIPS汇编基础4.1、MIPS SIMD架构(MSA)4.2、MIPS数据类型4.3、MIPS指令格式4.4、MIPS指令风格4.5、MIPS寄存器4.5.1、MIPS32寄存器...
  • 体系架构番外篇 - MIPS基本地址空间

    千次阅读 2015-11-16 22:48:12
    体系架构番外篇 - MIPS基本地址空间到底是无知者无畏还是博学者无畏? - XXX辩论场MIPS 图说地址空间 几大名词的描述:Kuseg - 低2G地址,所谓的用户态地址,有MMU被转化,没有则不建议使用! Kseg0 - 512M地址,...
  • MIPS架构

    千次阅读 2020-04-02 22:43:42
    一个是以 intel 和 AMD 为代表的 x86 架构,另一个是手机,平板等移动处理器所使用的 ARM 架构,再有就是当今发展趋势良好的开源架构 RISC-V,最后一个便是我国龙芯处理器所选择的 MIPS 架构。这四大处理器架构中,...
  • 本文件基于mips芯片架构的linux系统,可以以此对mips的linux系统进行系统的了解。
  • 由于一些原因,要在mips64架构的国产系统中打包python代码,但是pyinstaller安装过程可谓困难重重。 安装python2的pip sudo yum install python-pip 将pip换源为阿里或清华后,安装pyinstaller的依赖,这里直接...
  • MIPS架构对比ARM架构

    千次阅读 2020-07-07 16:14:43
    在很久很久以前,MIPS与ARM、X86合称全球三大主流CPU架构。但后来的发展情况,大家都看到了,X86在英特尔、AMD下占据了PC级和服务器市场,而ARM占据了移动端,但随着苹果、华为和其他芯片设计公司,基于ARM的CPU定制...
  • MIPS在继去年年底宣布开源后,MIPS 32位和64位架构的最新版本已于3月28日推出了,在MIPS Open网页可供任何人下载使用。 那么,今天在MIPS Open上下载的具体内容是什么?第一个版本包括: 32和64位MIPS指令集架构...
  • 本书是一本关于MIPS体系结构的经典之作。第2版在描述Linux/MIPS应用代码如何载入内存、如何连接到库以及如何运行等方面做了介绍。此外,书中还提供了完整的、经过更新的MIPS指令集指南。
  • 如果再见不能红着眼,是否还能红著脸 - CCNN一、MIPS上地址空间的内存管理 上述空间在32位操作系统和64位操作系统下,地址空间范围分别是:32位系统中 0x00000000 - 0x7fffffff, 无论用户态还是内核态都可以寻址! ...
  • 北京大学的MIPS体系结构课件,想要了解MIPS架构的朋友不容错过!
  • 由于本系列文档在介绍过程中,参考了很多MIPS官方,以及北京君正(Ingenic)的xburst系列处理器的资料,目的仅仅是为拓展MIPS架构以及Linux进自己的绵薄之力,如果有侵权行为时,请告知本人处理,谢谢 1 ...
  • 单周期MIPS架构

    2021-04-19 18:36:20
    下面来介绍一些常用MIPS指令的数据通路构建 (1)取指令数据通路 Men[PC++] -> IR 通过PC的地址调用指令存储器获得指令字,并且将PC+4(MIPS加4个字节),在时钟以后写入PC对PC进行更新。 (2)R型指令数据通路...
  • CPU体系架构-RISC和CISC CPU体系架构-寄存器 CPU体系架构-寻址方式 CPU体系架构-指令系统 CPU体系架构-函数调用实例 第二部分:分析了和CPU关系最近的几个硬件模块,依次是存储管理模型、...
  • redis rpm包 mips64el架构

    2021-03-04 13:56:41
    可以在mips64架构的国产化环境下进行安装
  • MIPS架构与ARM架构

    2014-12-21 19:02:32
    MIPS架构的处理器多用在网关、猫、机顶盒什么的。ARM处理器用在便携设备,智能手机。这两个东西的市场几乎很少重叠,因此也谈不上对比。 普通用户关注MIPS主要还是因为我国所谓的”龙芯“。龙芯一开始抄袭MIPS,...
  • ARM、X86和MIPS主流架构优缺点分析

    万次阅读 2015-12-14 19:57:41
    三种主流芯片架构1. ARMARM是高级精简指令集的简称(Advanced RISC Machine),它是一个32位的精简指令集架构,但也配备16位指令集,一般来讲比等价32位代码节省达35%,却能保留32位系统的所有优势。 ARM处理器的...
  • MIPS指令集架构

    千次阅读 2019-02-24 16:12:45
    MIPS指令集架构
  • 本书详细介绍了MIPS系列CPU的系统架构,并详实描述MIPS汇编语言,是经典的MIPS学习教材,因为龙芯也是MIPS架构的处理器,所以本书是学习龙芯系统开发的好教材。
  • 以龙芯2k为例,其I/O中断寄存器分为两种: 中断控制寄存器 中断路由寄存器 龙芯2k(以下简称ls2k),ls2k在中断分配的区域又细分了几个模块 Mailbox:中断队列寄存器 INTISR:中断状态寄存器,取决于核号 ...
  • MIPS体系结构相关基础知识

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,011
精华内容 2,804
关键字:

MIPS体系架构