2022春季OS预习

4 篇文章 1 订阅

计算机组成原理

CPU工作原理

CPU的功能:控制指令执行。

指令执行有五种基本操作:取指、译码、取数、运算、存数。

数据通路五个阶段:取指、译码和读寄存器、执行、访存、回写。

寄存器的加入将会影响流水线上的信息:为相邻的流水阶段增加寄存器 (e.g. IF/ID),寄存器可以将不同阶段的信息分隔开,在任何时间,每个阶段都在执行不同的指令。
流水线冒险( Hazard, 也称流水线相关问题) :相近 指令在流水线上出现某些关联,下一个时钟周期不能执行下一条指令,指令流水线必须出现停顿。
  1. 结构冒险:资源竞争,要使用的部件正在忙(同一部件在不同阶段中被不同的指令同时使用)。例如,若系统只有一个存储器部件,就会带来结构冒险问题。
  2. 数据冒险:指令执行所需的数据暂时不可用而造成的指令执行的停顿。数据冒险一般发生在相近指令访问个存储单元或寄存器时。后序指令需要等待前序指令执行完毕。
  3. 控制冒险:也称为分支冒险(branch hazard),必须根据前一条指令的执行结果才能确定下一条真正要执行的指令地址,此时流水线中取得的可能不是真正要执行的指令

解决冒险:

  1. 结构冒险:解决所需硬件资源的冲突,如果流水线仅有一个内存:读或写操作需要获取内存的权限、取值需要等待一个周期(引入流水线气泡);对于寄存器:我们将寄存器的使用权限分为两个部分,前半个周期进行写操作,后半个周期进行读操作、通过内部数据转发来实现(e.g.W到D的数据转发)。
  2. 数据冒险:①数据旁路(转发):什么时候转发?如何转发?如果不能转发则需要阻塞流水线。②阻塞与转发。
  3. 控制冒险/分支冒险:①条件分支(B指令)使用延迟分支与分支预测;②跳转(无条件分支)J指令:需要一个延迟槽,因为位于PC+4的指令总会在跳转前执行,所以返回位置PC+8。

TLB页表

①操作系统:合理地管理、调度计算机的硬件资源。存储器作为一种空间资源也由OS来管理。

CPU执行的程序:总是在操作系统和用户程序之间切换。主存中同时要存储OS和用户程序。磁盘中也要存储OS和用户程序。

CPU中的存储器管理部件MMU(分页内存管理单元)协助OS完成存储器访问。

②Hello的执行过程:

  1. Unix系统Shell命令行输入:hello,回车;
  2. Shell程序调用驻留在内存的“加载器”程序,由加载器从磁盘上找到特定的hello目标文件,将其指令代码和数据(“hello,world\n”)从磁盘到主存;
  3. 处理器从hello程序的指令代码开始执行;
  4. Hello程序将“hello,world\n”串中的字节从主存读出,送到显示器输出。

③进程(线程):操作系统对运行程序的抽象

  1. 一个系统可以同时运行多个进程,而每个进程都认为自己独占系统,实际上,操作系统让处理器交替执行多个进程中的指令;
  2. 进程的上下文:进程运行所需要的所有状态信息,例如:PC、寄存器的当前值、主存的内容、段/页表、进程的状态信息等;(系统中有一个专门空间用来存放当前进程的上下文)
  3. 上下文切换:任何时刻、系统中只有一个进程正在运行;(把正在运行的进程换下,换一个新的进程到处理器执行,上下文切换时,必须保存下进程的上下文,恢复换上进程的上下文)

④32位程序在内存中的存放

 ⑤虚拟存储管理模式:分页模式

把内存分成固定长且比较小的存储块,每个进程也被划分成固定长的程序块。程序块(页/page)可装到存储器可用的存储块(页框/page frame)中。无需使用连续页框来存放一个进程,操作系统为每个进程生成一个页表,通过页表实现逻辑地址向物理地址的转换。(逻辑地址:程序中指令所用的地址;物理地址:存放指令或数据的实际内存地址)

 ⑥页式虚拟存储器

进程划分成相同长度的程序块(页),称为虚页;主存分为大小相同的存储块(页),称为实页;主存按页顺序编号,每个独立编址的程序空间有自己的页号顺序,通过调度辅存中程序各页可离散装入主存不同实页位置。

CPU执行指令时,首先需将逻辑地址转换为主存的物理地址,地址转换由CPU中的MMU实现。

 ⑦快表TLB

每次虚拟存储器的访问带来两次存储器访问,一次访问页表,一次访问所需数据(或指令),因此使用Cache存储部分活跃的表项,他包含了最近使用的那些表项,TLB内容包括:标记(虚页号)、数据块(实页号)、有效位、修改位。(TLB一般采用全相联或者组相联)

MIPS汇编语言

MIPS体系结构

体系结构用来描述一个用于编程的抽象机器,而不是一个机器的具体实现。一般而言,一个CPU的体系结构包括一组指令集加上一些寄存器的知识,指令集与体系结构这两个术语基本上是同义词。

MIPS汇编语言风格初见

汇编语言是CPU原始二进制指令可工人书写和阅读的版本。与大多数汇编语言相同,MIPS汇编语言以行为单位,一行结尾表示指令的结束,约定忽略“#”字符之后的内容作为注释,一行中可以有多条指令,但中间需要使用分号分割开来。单词后面紧跟一个“:”作为一个标签,用来定义代码中的入口点和命名数据区的一个存储位置。

寄存器

 MIPS通用寄存器有三十二个,其中有两个的用法与其他不同。在其他的使用方面,所有寄存器都是一样的,可以再任何一个指令中使用。

 

在MIPS体系结构中,程序计数器不是寄存器,jal指令的返回地址是其后的下下一条指令,如前文所述紧跟调用指令的下一条指令是调用指令的延迟槽(按照规定该指令必须在分支目标指令之前执行),调用的延迟槽指令很少被浪费,因为经常可以用来建立调用的参数。

MIPS里没有状态码,状态寄存器或CPU的其他内部状态对用户级程序没有任何影响。

hi和lo这两个寄存器大小的结果端口与整数乘法运算相关,他们不是通用寄存器,除了乘除法指令之外没有其他用途。但是定义向这两个端口插入任何值的指令,这对于回复一个被终端的程序的状态是必需的。

通用寄存器的习惯命名和用法

 详细细节还请参考See MIPS Run Linux 2.3处。

整数乘法部件及寄存器

MIPS CPU采用了一个专用的整数乘法部件,没有集成到主流水线中,乘法单元的基本操作是将两个寄存器大小的值相乘得到一个两倍于之前寄存器大小的结果,存放在乘法单元里面,指令mfhi、mflo分两半将结果传送到指定通用寄存器。乘法的结果返回没有快到自动供随后指令使用的程度,因此乘法的结果寄存器总是互锁的,在乘法运算完成之前任何企图读取结果的操作都将导致CPU停下来等待乘法操作结束。

整数乘法器也可以执行两个通用寄存器的除法操作,这时lo寄存器用来存放结果,hi寄存器用来存放余数。

整数乘除操作从不产生异常:即使是除以零也不会发生异常,而编译器常常会产生额外的指令检查和捕获错误,特别是被零除的错误。

此外。还定义了mthi、mtlo用来将通用寄存器的值传送到乘法单元的内部寄存器,这对于从中断返回时恢复hi和lo的值是必不可少的,但在其他地方可能都不会用到。

加载与存储:寻址方式

如前文所言,MIPS只用一种寻址方式(目前已不完全正确),任何加载或存储操作的机器指令都可以写成:lw $1, offset($2)。

你可以用任何寄存器作为目标和源寄存器,偏移量offset是一个有符号的16位的数字,加载所用的程序地址是$2寄存器的值和offset的和。这种寻址方式一般已足够存取C语言结构体的一个成员,同时也支持实现以常量为索引的数组,用堆栈指针或者帧指针存取函数的局部变量,并为静态和外部变量提供一个以gp的值为中心的适当大小的全局空间。

汇编器提供一个类似简单直接寻址的方式来加载一个在连接时刻才能确定地址的内存变量的值,其余更负载的寻址方式都必须通过多个指令的序列实现。

存储器与寄存器的数据类型

我们在此只讨论整数数据类型。

字节byte和半字halfword的加载有两种方式,符号扩展指令lb和lh指令将数值存放在32位寄存器的低位,并将高位用符号位(字节的第七位,半字的第十五位)的值来填充。这样就正确地将一个有符号整数转换成了一个32位的有符号的整数。

无符号的指令lbu和lhu用零来扩展数据,将数据值加载到32位寄存器的低位中,并用零来填充高位。

汇编语言的合成指令

汇编器在下面的方面为你提供帮助生成指令:

  1. 32位立即数的加载:拆开为两个指令,分别加载数据的高半部分和低半部分;
  2. 从内存地址加载:先是一条把变量地址的高位加载至临时寄存器的指令,接着是一条以该变量的低位地址为偏移量的加载指令。
  3. 对内存变量的快速存取:使用相对gp寄存器寻址的加载或存储指令。
  4. 更多类型的分支条件:使用两个寄存器进行算术运算。
  5. 同一指令的简写或多种不同的写法:对运算进行简化,对指令进行扩充。
  6. 隐藏分支延迟槽:但是汇编器一般没法看出来。
  7. 未对齐的数据传送:即使未对齐也正确存取。
  8. 其他的流水线校正:针对CPU的优化。

基本地址空间

MIPS中程序地址与物理地址分开,CPU可以运行在两种特权级之一上:用户态和核心态。但是MIPS的一个特点是从核心态到用户态的变化并不改变操作的行为,只是有时候某些操作被认为非法。在用户态,地址最高位为一的任何程序地址都是非法的,而且有些指令在用户态也会导致异常。

kuseg(低端2G):用户态可用的地址,无MMU的处理器无法直接移植。

kseg0(512M):通过Cache存取,无MMU系统中用于存放程序和数据,有MMU的系统用于存放操作系统核心。

kseg1(512M):系统重启时能正常工作的地址空间,复位入口(0x1FC0 0000),用于存取初始程序ROM。

kseg2(1G):只能在核心态下使用并且要通过MMU的转换。

具体细节地址使用参考 See MIPS Run Linux 2.8处。

简单系统的寻址

MIPS的程序地址从来不会和物理地址简单相等,但简单的嵌入式只是用kseg0和kseg1的地址,他们与物理地址有着非常简单的映射关系。

从0x2000 0000(512M)开始向上的物理地址空间在上述简单情形下没有任何的映射,大多数简单的系统所有地址都映射到512M以下。可以使用TLB的方式来存取512M以上的地址。

核心与用户特权级

在核心特权级下(CPU启动时),可以做任何事情。在用户态下,2G(最高位置位的)以上的程序地址是非法的。如果CPU有MMU,就意味着所有的用户地址在真正到达物理地址之前必须经过MMU的转换,从而使得操作系统有能力防止用户程序失去控制。

另外,有些指令(特别是操作系统需要的那些CPU控制指令)在用户态是非法的。

当你改变核心态/用户态特权级模式位时,并不改变任何行为的解释,仅仅是某些功能在用户态下禁止,这就意味着核心态下可以做与用户态一样的事情。

流水线可见性

MIPS体系结构让一些流水线的特点可见,把任务交给程序员或者编译器:

  • 分支延迟:在MIPS中,分支延迟槽中的指令即便跳转成功也会执行,因此需要找出一条有用的或者至少是无害的指令填充延迟槽(最差的情形填充nop)。
  • 加载延迟:编译器和程序员能看到加载后的延迟,保证装载后下下一条指令可以使用数据。
  • 浮点数(协处理器1)的问题:浮点数运算未结束时,读取结果寄存器会对CPU进行阻塞。
  • CPU控制指令问题:当你改变CP0的域时(比如CPU状态寄存器的内容),你潜在地影响到了发生在流水线所有阶段的问题。

协处理器0:MIPS处理器控制

全几把是鸟语,自己看去吧,《IDT R30xx Family Software Reference Manual》Chapter3。

还是稍微复习一下,因为当时这块也只懂个大概。

在运算功能之外,处理器需要一些部件处理中断、配置选项以及需要某种机制来监控诸如高速缓存和定时器等功能,因此就产生了协处理器一词。

MIPS CPU 协处理器 CP0 功能:

  • CPU配置:可以选择CPU的主要特性,或者改变系统接口的工作方式。
  • 高速缓存控制:CP0 的Cache指令用来操纵高速缓存的数据块。
  • 异常/中断控制:CP0控制寄存器和几条特殊指令来定义和控制异常和中断时的行为以及处理方式。
  • 存储管理单元控制:MMU能咋控制,就怎么分配呗。
  • 杂项:定时器、时间计数器、奇偶校验、错误检测以及其他新增功能。

协处理器:

协处理器通常表示处理器的一个可选部件,负责处理指令集的某个扩展。

  • 协处理器1是浮点协处理器。
  • 协处理器0(CP0)是MIPS的系统控制协处理器,其指令对处理用户态程序之外的所有功能都是必不可少的。它为CPU提供了状态寄存器(CPU不可能只有一种状态)。
  • CP3只有在不会实现浮点的时候才会使用。
  • CP2依然可用,用于ISA扩展或为应用提供专用的寄存器。

MIPS CPU 控制寄存器请移步到具体标准处查看。

再后面好像就真得瞄一眼鸟语书了。

C程序设计、编译与运行

仔细阅读,不转载了。

预处理器命令

内存模型、指针、地址

助教的提示TIPS:

  • 标注为“已初始化的数据”的段为.data段
  • 标注为“未初始化的数据”的段为.bss段
  • 标准为“代码段”的段为.text段

第一段没啥理论要看的需要用的时候查一下就行了。

内存空间

这张就结合计组那张图一起看就行了。

内存分配

①静态内存

全局变量、全局数组、静态变量、常量均存于已初始化数据段或未初始化数据段;

局部变量、局部数组均存于栈上;

此外,函数调用的信息也存于栈上。(可能用于链接就得拎出来)

②动态内存

动态内存分配就是程序运行在堆上进行的内存分配。

一般来说堆上分配内存的效率比栈上分配内存的效率低,因此静态内存分配是问题空间已知时较好的选择。

工具准备

命令行环境

The Missing Semester of Your CS Education

Vim Tutorial

Git软件

Learn Git Branching

GCC编译

GCC参数详解

An Introduction to GCC

多文件编译链接与Makefile

Make命令教程

GCC Make

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值