深入浅出MIPS 〇 序章

  信息时代的世界,有着光鲜亮丽的外壳。Web2.0的时代,搜索引擎,SNS,流媒体...这绚丽多彩的一切,流光溢彩,仿佛云霓灿烂。
  剥去这光鲜的外壳,深入到底层的世界。内核,体系结构,编译器...完全是0和1组成的黑白世界,初涉之难免觉得味同嚼蜡。
  但是,正如单一的白光在三棱镜下,会绽放出七彩的光谱,黑白的计算机底层世界,却有着魔法一般丰富的内涵。当我们看穿华丽的GUI界面的伪装,探究到内核的奥秘时,我们会发现这是一个迷人的微观世界。这个美丽新世界,最具魅力的是哪些呢?
  体系结构。它是计算机系统的基石。它从根本上决定了这个系统的性能。当程序中出现错误时,对体系结构的理解,能大大加快Bug的定位。体系结构是底层世界的根基。
  操作系统。它是计算机系统的灵魂。操作系统屏蔽了底层硬件的差异,为上层软件提供了统一的API。多任务操作系统还可以让计算机并行处理不同的任务,巧妙的设计可以发挥CPU最大的潜力。目前的最新操作系统版本,还可以支持多CPU并发处理。操作系统内核是底层世界的统治者。
  编译器。编译器是体系结构的翻译官。它能够将高级语言翻译成机器指令,与操作系统提供的API接口连接,开发出各种应用程序。好的编译器还可以针对硬件做优化。编译器是底层世界的一把金钥匙。

  体系结构,操作系统,编译器支撑起的系统,如同三只足支撑的一只鼎。操作系统中的经典之作,是Linux;对应的编译器是gcc系列工具链。关于这些的著作早已汗牛充栋。我想给大家介绍的,是体系结构皇冠上的明珠——MIPS。



 英国科学家Dominic Sweetman(经典著作See MIPS Run的作者),称MIPS为“高效的RISC体系结构中最优雅的一种体系结构”。它是一个双关语:即是Microcomputer without Interlocked Pipeline Stages的缩写,同时又是Millions of Instructions Per Second的缩写。
  MIPS的处理单元是一个五级流水线:Instruction Fetch, Register & Decoder, ALU, Memory以及Write back。一开始的MIPS是为32位系统设计的,实际上,后续的64位扩展,也依然对32位的工作模式向下兼容着。一如其他的RISC处理器,MIPS的每条指令长度是固定的32bit。(因此,最长的局部跳转指令只能跳转2的26次方Byte,也就是2的24次方,16777216条指令)
  MIPS有32个通用寄存器,编程者可以使用其中除$0外的所有寄存器暂存数据。$0寄存器,在硬件上被设计为永远读出0。我们可以用$0寄存器的此特性,实现一些技巧性的编程,譬如实现NOP操作。MIPS本没有NOP指令,但由于对$0寄存器的写入实际上无意义,可以作为空操作使用。
  事实上,编译器从高级语言(典型如C/C++)转换为MIPS汇编指令时,一般总是遵守一定的寄存器使用约定。某些寄存器用来从函数中传入和传出参数,存储临时数据,另一些则起特殊作用,如保存调用函数时的指令地址,或作为堆栈指针等。如果你使用汇编开发,理论上可以无视这点约定,但是,一般地,遵守这个约定,与人方便,也为己方便。关于寄存器使用的约定,以后会展开论述。
  一如所有的RISC处理器,MIPS没有CISC那样复杂多变的寻址方式,统一为Load/Store寻址。任何载入和存储操作,都可写为如下形式:
  lw $1, offset ($2)
  这条指令的操作符可以为Load或Store,一次Load/Store操作的范围可以为字/半字/字节(对应gcc的int, short和char)。偏移量是一个带符号的16bit整数。两个作为操作数的寄存器可以是任何通用寄存器。(你可以向$0写入,但无任何意义,等同于空操作)。对于64位模式下,也可以对double类型进行操作。注意Load/Store都必须对应一个对齐的地址,否则会引发一个异常(Exception)。
  MIPS支持最多4个协处理器。协处理器CP0为CPU的控制协处理器,是体系结构中必须实现的。CP1为浮点处理器。CP2保留,各生产厂商往往用来实现一些自己的特色功能,例如RMI的Fast Message Ring等。CP3原本也是保留共扩展用,但很多MIPS III和MIPS IV时代的扩展指令集使用了它。对于CP0,我们会有专门的一段用来讨论。
  为适应处理器向多核时代的演进,MIPS引入了多核操作必要的原子指令(Atomic operation)、内存屏障(Barrier)等操作。在SMP或AMP等多核架构中,这些指令是并行计算同步的保障。

你可能感兴趣的:(linxu内核)