国防科大 . 麒麟操作系统

Sina WeiboBaiduLinkedInQQGoogle+RedditEvernote分享

(如果播放存在问题,请访问土豆视频版本陈怀临时间–国防科大 . 麒麟操作系统

(5个打分, 平均:3.80 / 5)

《See MIPS Run》–附录D MIPS的演化

附录D MIPS的演化

MIPS16是一个1997年面世的可选的指令集扩展,它能减少二进制程序尺寸的30-40%。实现者希望这种CPU能够在很关心代码尺寸的场合中更有吸引力–这种场合通常就是指低成本系统。由于只应用于特定实现,它是一个多厂商标准:LSI, NEC和Philips都生产支持MIPS16的CPU。
在前面1.2节中我们说过,使MIPS二进制代码比其他架构的并不是MIPS指令集干的活少了, 而是他们的尺寸更大一些–每个指令4字节长,相比之下某些CISC架构一般平均只有3个字节。
MIPS增加了一种模式,在这种模式下CPU可以对16位固定大小的指令进行解码。大多数MIPS16指令扩展成正常的MIPS III指令,所以很明显这将是一个相当受限制的指令子集。窍门就在于使这个子集对足够多的程序充分的进行高效编码,以使整个程序的大小得到大大的压缩。
当然,16位指令并不会使其变成一个16位指令集。MIPS16 CPU是实际存在的带有32位或者64位寄存器的的CPU,MIPS16 CPU的运算也都在这些寄存器上。
MIPS16远不是一个完整的指令集—例如它既没有CPU控制指令,也没有浮点运算指令。但没有关系,因为每一个MIPS16 CPU也必须要运行完整的MIPS ISA。你能运行MIPS16和正常的MIPS代码的混合指令。每个函数调用或者跳转-寄存器指令都能改变运行模式。

阅读全文»

(1个打分, 平均:5.00 / 5)

《See MIPS Run》–附录A 指令的时序和优化

附录A 指令的时序和优化
MIPS CPU高度流水化,所以它们执行代码的速度依赖于流水线的工作情况。有某些情况下,代码的正确性依赖于流水线的工作方式—特别是使用CPU控制协处理器0的指令和寄存器。
通过显式使用寄存器而传递的依赖性相当明显,只不过比较凌乱。除此以外,在隐式使用的寄存器中也有一些偶然的依赖关系。例如状态寄存器中的CPU控制标志会影响到所有指令的指令的执行,改变这些标志必须非常小心。
大部分MIPS指令需要在流水线RD阶段的结束时得到它们的操作数,并且要在随后的ALU阶段的结束时产生这些指令的运行结果,这如图A.1所示的那样。如果所有的指令总能够遵守这些规则,任何指令序列都能够以最大速度正确的运行。在MIPS架构中最大的奥妙就是绝大多数指令都能遵守这些规则。
在由于某些原因而不能做到的情况下,使用从前面的紧邻指令处得到操作数的指令不能及时正确的运行。这种情况能被硬件检测到,然后通过延迟第二条指令直到数据准备好以使之得到修正,或者它可以留给程序员来避免产生试图使用未准备好的数据(pipeline hazard流水线冒险)的指令序列。

阅读全文»

(没有打分)

《See MIPS Run》–第十章 MIPS的C 语言编程

第十章 MIPS 的C 语言编程
本章主要讨论用C 语言建立完整的MIPS 系统可能需要具备的一些知识因此更多时候本章讲述C 编译器产生的汇编语言代码而不是C 语言代码为避免讨论过于繁琐而使本章膨胀到一本新书的规模现假定读者您是第一次向MIPS 平台移植代码.

一个高效的C 运行环境依赖于C 语言程序的寄存器使用约定这一般由C 编译器强制规定因此对于汇编工程师来说也是需要强制遵守的参照2.2.1 部分对寄存器使用的全部约定本章内容涉及
*堆栈子程序链接参数传递关于MIPS 进程是如何实现的以及如何为避免不必要工作而支持的各种特性
*共享库和非共享库关于在复杂机器上支持共享库OS 的一点注解
*介绍编译器的优化可能对MIPS 上C 语言编程造成的影响
*C 语言访问设备的提示关于如何写绝大多数设备驱动
即使你使用其他的高级语言而非C 语言只要你想为MIPS 编译代码并与标准库链接那么本章的大多数内容还是对你有所帮助的在这儿我并没有针对特定编程语言是因为我对他们了解不够一直不知道如何恰当的点到为止

阅读全文:第十章 MIPS的C 语言编程

(没有打分)

《See MIPS Run》–第九章 汇编编程

第九章 汇编编程
这一章将告诉你如何阅读并编写MIPS体系下的汇编代码。MIPS汇编代码看上去与实际的代码差异很大,这主要是因为以下原因:

1,      MIPS汇编编译器(assembler)提供了大量的已经预定义的宏指令(extra macro-instruction)。所以编译器的指令集(instruction set)要比CPU实际提供的指令集大的多。

2,在MIPS汇编代码中有许多伪操作符,放在代码开始和结束的地方,用来预定义常用数据,控制指令排列顺序,以及控制对代码的优化。通常它们被称为“directives”或“pseudops”。

3,实际应用中,汇编代码往往要经过C语言预处理器(C preprocessor)的处理后,才被提交给assembler进行编译。C语言预处理器将汇编代码中的宏,用它自己的头文件中的定义进行替换。这可以使汇编代码书写起来稍微方便一点。
在你继续看下去之前,最好先回去温习一下Chapter-2的内容,包括低层机器码的构造,数据类型,寻址方式。

阅读全文»

(2个打分, 平均:4.50 / 5)

《See MIPS Run》–第六章 内存管理与TLB

第六章 内存管理与TLB   

    我们倾向于直接从最底层引入本书中的大部分主题进行探讨,对于一本关注计算机底层体系结构的书而言,这似乎是自然而然的。然而,为了说清楚内存管理硬件,我们得从MIPS R2000所寻求实现的unix风格的虚拟存储系统开始讲起。本章的后面我们还会讨论一下相同的硬件如何在其他环境下工作。

早期的MIPS CPU定位于支持运行在UNIX工作站与服务器上的应用程序,因此内存管理硬件被构想为一个最小化的能帮助BSD UNIX——一个经过完善设计并拥有充分多虚拟存储需求的操作系统的典型——提供内存管理功能的硬件。很明显的是,这些设计者们十分熟悉DEC VAX小型机,并且在从这种体系结构中获取了众多思路的同时,也摒弃了许多复杂设计。尤其是许多VAX使用微代码来解决的问题,在MIPS中被交由软件处理。

本章中我们将从MIPS的设计起点开始,面对着一个unix类型的操作系统以及它的虚存系统的众多需求。我们将会展示一下MIPS的硬件是如何满足这些需求的。结尾时,我们会讨论一下在不能像通常一样使用内存管理硬件的嵌入式系统中,您可以采取的几种使用方式。

阅读全文»

(2个打分, 平均:5.00 / 5)

《See MIPS Run》–第五章 异常,中断与初始化

第五章 异常,中断与初始化

在MIPS体系结构中,中断,陷入,系统调用,以及其他中断程序正常执行的事情统统被称为异常.异常在MIPS体系结构中被同一种机制处理.异常包括:

外部事件.包括中断,读总线错.在有外部事件时,中断被用来引起CPU的注意.使用中断比使用CPU轮询机制来得快且更有效.
中断是唯一由CPU执行以外的事件引起的异常.因为我们不能通过注意来避免中断,在必要是,我们只能用一种软件的办法来禁止中断.

内存映射异常.当没有合适的物理地址对应虚拟地址时,或当写一个有写保护的页时,会发生此种异常.操作系统会监查内存映射异常的具体原因.某些异常是由于应用程序访问了非法内存.操作系统会终止应用程序的执行以保护其他应用程序.良性的内存映射异常可以触发操作系统执行从复杂到简单的一系列操作:操作可以复杂到装入一个需要时调入内存的虚拟页,或简单到扩大栈的空间.

其他需要内核更正的不寻常情况.一个例子是浮点指令:当硬件无法处理某些困难和少见的操作符和操作数的组合时,硬件会产生一个异常,寻求软件模拟.这类情况比较模糊,因为不同的对这类情况会有不同的处理意见.未对齐的装入在某些操作系统中被由软件处理,在另外一些操作系统中被当做错误.

程序或硬件检查出的错误.包括非法指令,在不正确的用户权限下执行的指令,在相应SR位被禁止时执行的协处理器指令,整数溢出,地址对齐出错,用户模式下访问超出用户段(KUSEG)地址.

数据完整性错误.很多MIPS CPU不断对来自总线和缓存的数据作字节校验或字校验.校验错在R4000及以后的CPU上产生一个特殊异常.

系统调用和陷入.某些指令只是用来产生异常.它们提供了一种进入操作系统的安全机制(系统调用,条件陷入,断点).

某些事件不产生中断,尽管大家认为它们会.比如写总线错.CPU把数据和地址放入写缓冲中,然后继续执行.写操作可能在几个时钟周期后发生.在这种情况下,很难判断到底是哪条指令产生写错误.某些系统利用外部机制来解决这个问题.这种外部机制有可能会产生异常来引起CPU注意.

更为有意思的是,在大多数32位的CPU上,缓存中的校验错不产生异常.错误被放在一个状态寄存器位SR(PE)里,你必需自己去察看它.在R3000(32位的CPU)里,缓存校验在以后加入用于调试目的.

阅读全文»

(2个打分, 平均:4.50 / 5)

《See MIPS Run》–第四章 MIPS缓存

第四章 Cache for MIPS
没有Cache的MIPSCPU不能称为真正的RISC。可能这样说不公平。但为了一些特殊的目的,你可以设计一个含有小而紧密内存的MIPSCPU,而这些内存只需要固定个数的流水线步骤(最好是一个)就可以被访问到。但绝大部分MIPS CPU都是含有cache的。

这一章将介绍MIPS的cache怎样工作和软件应该怎么做才能使它可以被使用而且是可靠的。MIPSCPU重新启动后,cache的状态是不确定的,所以软件必须非常小心。你有一些线索知道cache的大小(如果你直接知道cache的大小后去初始化,这是一个不好的软件习惯。)。对于诊断程序员,我们将讨论怎样测试cache和获取特殊入口。

对于实时应用程序的程序员,希望在CPU运行时能够正确地控制cache。我们也将讨论怎么做,虽然我对使用一些窍门方式有怀疑。 当然这些也随着MIPSCPU的发展而进步。对于早期的32位MIPS处理器,初始化cache或者使其无效,首先让cache进入一种特殊的状态,然后通过普通的读写操作来完成。对于后来的处理器,一些特殊的指令被定义出来做这些相关的操作。

阅读全文»

(2个打分, 平均:5.00 / 5)

《See MIPS Run》–第三章 协处理器0

第三章 协处理器0: MIPS 处理器控制
除了通常的运算功能之外,任何处理器都需要一些部件来处理中断,提供可选项配置方法以及某种观察或控制诸如高速缓存(cache) 和时钟等片上功能的途径。但要用一个干净的、和具体实现无关的方法来描述这些东西很难,不象指令集中表示运算功能那么简单。

为了更便于读者理解,我们会把不同的功能分成几章来介绍。这一章里我们先介绍用来实现这些特色功能的公共机制。在读后续的三章之前,您应该先读本章的前面部分,特别要注意“协处理器”(下面将有解释)一词的含义。那么, MIPS CPU 的协处理器0 (以下简称CP0 )做些什么工作呢?

配置: MIPS 硬件常常是很灵活的,您可能可以选择一些很根本的CPU 特性(例如大尾端/小尾端,参见第11章)或者改变系统接口的工作方式。这些选项的控制和可见性通常由一个(一些)内部寄存器决定。

高速缓存控制: MIPS CPU 总是集成了高速缓存控制器,(除了最古老的芯片)也都集成了高速缓存本身。连最早期的MIPS CPU 都在状态寄存器里有高速缓存控制的字段。R4000 以后,就有专门的CP0 指令来操纵高速
缓存的每一项了。我们将在第4 章讨论高速缓存。

例外/中断控制: 象中断或者例外时发生什么,您应该做什么来处理它等事情都由一些CP0 控制寄存器和特殊指令来定义和控制。这会在第5 章讨论。

存储管理单元控制: 第6 章讨论这个话题。

杂项: 总是有更多的东西:时钟、事件计数器、奇偶校验错误检测等等。无论什么时候额外的功能被集成到CPU 里边,不再能方便地当作外设访问时,这里就要增加一些东西。

阅读全章PDF文件:《See MIPS Run》–第三章 协处理器0

(没有打分)

《See MIPS Run》–第二章 MIPS体系结构

第二章 MIPS体系结构

在计算世界中, “体系结构”一词被用来描述一个抽象的机器,而不是一个具体的机器实现. 这一点非常有用的, 用来区分在市场广告上已经被滥用的”体系结构”这个术语. 读者有可能不熟悉”抽象描述”,但其概念其实很简单.

当然,如果你是一个喜欢在 滑的路上开快车的司机,前轮还是后轮驱动就很有所谓了。计算机也是如此。如果你需要高性能计算,一个计算机的具体参数与实现对你就很重要了。

一般而言,一个CPU的体系结构有一个指令集加上一些寄存器而组成。“指令集”与”体系结构“这两个术语是同义词。你经常会看见ISA(指令集体系结构–ISA)的缩写。

MIPS体系结构家族包含如下几代。每一代之间都有一些区别。

MIPS 1:32位处理器使用的指令集。仍然被广泛使用着。
MIPS II:为R6000机器所定义的,包含了一些细微的改进。后来实现在1995年的32位MIPS实现中。
MIPS III:R4xxx的64位指令集。
MIPC IV: MIPS III的一个细微的升级。定义在R10000和R5000中。

上述的MIPS体系结构等级与MIPS公司提供的文档中定义的是一致的。这些文档提供了足够的信息,以使得同一个UNIX应用程序可以在不同的MIPS体系结构等级上运行,但是在操作系统或底层相关的代码方面的移植方面,显得不足。MIPS CPU其他一些软件可见的方面都是于具体CPU实现相关的。

在本书中,我将更加慷慨大方些。有时候,我会描述一个在MIPS 体系结构手册中找不到的,但却在所有MIPS III 体系结构实现中能发现的并且你会遇到的功能。

另外,除了ISA等级,大多数MIPS CPU在实现方法上分为两大类:早期的MIRS R3000和其他所有的32位MIPS CPU;另外就是已MIPS R4000为代表的64位CPU。

有不少MIPS CPU的实现加入了一些新指令和其他一些有趣的功能。对於软件或工具( 如编译器)而言,要利用这些非标准的,依赖于具体实现的功能是不容易的。

我们可以在两种细节层次上来描述MIPS的体系结构。第一种描述(本章)是在汇编语言的层次上看待你的程序,比如,你在工作站上写一个应用程序。这也意味着CPU的所有一般的计算是可见的。

在下面章节里,我们将介绍MIPS的各个方面,包括建构在CPU之上的操作系统所掩盖的所有CPU的细节,CPU控制寄存器,中断,陷入,高速缓冲操作和内存管理。至少我们会将一个CPU分成一些小部分来学习和介绍。

阅读全文»

(3个打分, 平均:5.00 / 5)