OS实验
OS实验OS采用MIPS32的相关补充MIPS Calling Convention
一个栈帧一般由5个部分组成:
用于本地数据存储的部分,函数会为此区域内所有局部变量保留足够存储空间,包括要在函数调用前后保留的任何临时寄存器值的空间
(Pad,空白填充)作用是为了确保栈帧总大小是8字节的倍数,确保上方局部数据存储部分是双字对齐,与64位体系结构的双字读取指令兼容。不一定存在,需要根据具体情况给出分配。一般来说是一个字,因为假若原本的字的个数是偶数,则字节数一定能整除8(一个字4个字节的话);若为奇数,只需要Pad填充一个字即可得到偶数字,因此至多只需要一个Pad。
返回地址部分,即存储$ra值的部分。只有在函数内部需要调用其他函数的时候才需要。
保留寄存器部分,保存当前子函数被调用时,当前子函数需要保存的寄存器(如:$S0 到 $s7)的值,在当前函数中就可以随意使用这些寄存器了,注意:在当前子函数返回前需要将相应寄存器的值给返回回去。这样一来父函数认为完全没有发生改变。
参数部分,父函数调用子函数时会将子函数需要的参数传入此处,实现对函数调用时的传参。注意:由于$a0-$a3只要 ...
算法
算法杂项滑动窗口与双指针定长滑动窗口将窗口长度固定,移动左右边界left和right来维护长度。一些基础题:leetcode:定长字串中元音字母的最大数目等。进阶题:存在重复元素|||等。
KMP算法前缀函数某一字符串的所有不包含自身的相同前后缀中长度最长的值,记为Π。例如:ATAATA的前缀值Π = 3.对于一个字符数组,可以用数组Π[i]表示到第(i + 1)个字符形成的字符串的Π值。例如:对ATAATA的Π[] = [0, 0, 1, 1, 2, 3].那么想要对于主串S判断其中是否存在字串s,只需要将s和S通过特殊的字符’#’连接起来,并计算Π数组,其中只要有数组值刚好等于s.len即可说明s存在于S中,否则不存在;注意:此处的特殊字符不一定一定是’#’,但一定是不存在于主串中的字符。接下来就是对于Π数组的计算,由于对于第一个字符没有前后缀,因此其Π值刚好是0,而此后的字符stri,可以比较str[Π[i - 1]]与str[i]的关系。若相等,则说明,Π[i]就是在Π[i - 1]的基础上加1;反之,进一步去比较str[Π[Π[i - 1] - 1 ...
CO理论重点与易错点
计组理论重点与易错点Cache1.时间局部性:最近的未来要用到的信息,很可能是现在正在使用的数据,因为程序中存在循环和需要多次重复执行的子程序段,以及对数组的存储和访问操作。
空间局部性:最近的未来要用到的信息,很可能与现在正在使用的信息在存储空间上是邻近的,因为指令通常是顺序存放、执行指令的,数据也一般是以向量、数组等形式簇聚地存储的。
2.Cache与主存间按数据块为单位进行数据交换,Cache与CPU之间以字为单位进行数据交换。
3.CPU与Cache间数据交换以字为单位,而Cache与主存间的数据交换以Cache块为单位。
4.当集中访问的存储区超过Cache组的大小时,命中率可能变得很低,这种现象被称为抖动。
5.Cache一致性问题:主要针对写操作。
一、写命中:
1).全写法/直写法:CPU对Cache写命中时,必须将数据同时写入Cache和主存,实现简单,能够随时保持主存数据的正确性。但增加了访存次数。改进:写缓冲,CPU写命中时同时写入Cache和写缓冲(位于Cache和主存之间的一个FIFO队列)中,其可解决速度不匹配问题,但若出现频繁写会使写缓冲饱和溢出 ...
P7_L0_document
P7_L0_document设计草稿任务清单新增加指令:
eret:COP0== 010000、func ==011000,PC <- CP0[EPC]
mfc0:COP0== 010000、rs(原来rs的地方)== 00000,GRF[rt] <- CP0[rd]
mtc0:COP0 == 010000、rs(原来rs的地方) == 00100,CP0[rd] <- GRF[rt]
syscall:op == 000000、func == 001100
任务
解释
计时器
课程组提供代码,理解应用即可
系统桥
为CPU提供统一的访问外设的接口,需按规格自行实现
协处理器CP0
设置CPU的异常处理功能,反馈CPU的异常信息,需按规格自行实现
内部异常检测与流水
CPU需可检测内部指令执行错误的能力
外部中断响应
CPU需有初步相应外部中断信号的能力
异常处理指令
异常处理程序 ...
P6_L0_document
P6_L0_document设计草稿设计说明支持如下指令集:
add, sub, and(op==0, func==100100), or(func == 100101), slt(func == 101010), sltu(func == 101011), lui ,addi(op ==001000), andi(op==001100), ori ,lb(op == 100000), lh(op==100001), lw, sb(op == 101000), sh(op == 101001), sw, mult(func == 011000), multu(func==011001), div(func == 011010), divu(func == 011011), mfhi(func ...
P5_L0_document
P5设计草稿设计要求使用Verilog语言设计一个支持add、sub、ori、lw、sw、beq、lui、jal、jr、nop指令集的五级流水线设计。
1.对于b类和j类指令,流水线设计必须支持延迟槽,需要注意使用PC@D+8或PC@F+4(跳转指令在D阶段时)。
2.为了解决数据冒险而设计的转发数据来源应是是某一级流水线寄存器,不允许对功能部件的输出直接进行转发。
3.IM:容量为 16KiB(4096 × 32bit)。DM:容量为 12KiB(3072 × 32bit)。
大致思路先不考虑数据冒险问题,将正常运行的流水线CPU框架搭起来,再根据相关指令添加相应的冒险解决通路(如重定向、阻塞和刷新等方式),并且并不把因冒险导致增加的相关数据通路(除冲突判断信号的产生外)模块化,减轻课上加指令时的压力。
数据通路通过将单周期处理器分解成由5个流水线阶段(F(取指)、D(译码)、E(运算)、M(访存)、W(回写))构成的流水线处理器来提高CPU的吞吐量。
为保证每一个流水线阶段相应的指令时间下的状态值正确,需要在不同阶段间增加流水线寄存器堆来维持相应阶段的状态,以提供数据的流水级的简 ...
P4_L0_document
P4课下目标将P3中使用Logisim搭建的MIPS单周期CPU电路转用Verilog HDL描述,并在其基础上支持更多指令。
完成的只是从Logisim电路到Verilog代码的映射。
设计草稿整体设计
具体模块化与层次化设计单周期处理器顶层模块、控制器和数据通路,放置在顶层目录下。code.txt存储相应的机器码。处理器为32位单周期处理器,不考虑延迟槽,支持指令为add, sub, ori, lw, sw, beq, lui, jal, jr, nop,nop为空指令,不进行任何操作,add, sub 按无符号加减法处理(不考虑溢出)。
控制器模块用一个独立的Verilog HDL文件,实现控制器这个单一的职责,降低模块间耦合度。
顶层目录其中每个module都由一个独立的Verilog HDL文件组成。
顶层文件为mips.v,有效驱动信号要求包括且仅包括同步复位信号 reset 和时钟信号 clk,接口定义如下:
1234module mips( input clk, input reset);
数据通路设计P3遗产(我的丑陋的数据通路图)
注意根据设计的数据通 ...
P3_L0_document
P3课下设计草稿设计要求处理器为32位单周期处理器,支持:add(000000 rs(5) rt(5) rd(5) 00000 100000), sub(000000 rs rt rd 00000 100010), ori(001101 rs rt imm), lw(100011 base(5) rt offset), sw(101011 base rt offset), beq(000100 rs rt offset(16)), lui(001111 00000 rt immediate)(将立即数加载至高位), nop(0x00000000)
对于每一条指令的执行,应该可以拆分成取指令、译码、执行、访存和回写5个主要的步骤。
模块规格IFU(取指令单元)模块端口:
信号名
方向
描述
clk
I
时钟信号
reset
I
异步复位信号,将PC寄存器的值复位为起始地址0x00003000(即将PC置0:其中1:复位;0:无效。)
NPC
I
32位,代表下一条指令的地址,读入后用PC寄存器存储起来
PC
O
32位,代表当前指令的地址,输出给NPC模块来生成下 ...
C++
CPP环境配置g++常用命令选项
选项
解释
-ansi
只支持ANSI标准的C语法,禁止GNU C的某些特色,如asm或typeof关键词
-c
只编译并生成目标文件
-DMACRO
以字符串“1”定义MACRO宏
-DMACRO=DEFN
以“DEFN”定义宏
-E
只运行C预编译器
-g
生成调试信息
-IDIRECTORY
指定额外的头文件搜索路径DIRECTORY
-LDIRECTORY
指定额外的函数库搜索路径DIRECTORY
-lLIBRARY
连接时搜索指定的函数库LIBRARY
-m486
针对486进行代码优化
-o
FILE生成指定的输出文件,用在生成可执行文件时
-O0
不进行优化理
-O/-O1
优化生成代码
-O2
进一步优化
-O3
再进一步,包括inline函数
-shared
生成共享目标文件
-static
禁止使用共享链接
-UMACRO
取消对MACRO宏的定义
-w
不生产任何警告信息
-Wall
生成所有警告信息
基本语法命名空间存 ...
CO上机(Pre-P2)
计组上机Pre第一题(Logisim)题目大意:输出一个持续填入数组的当前数an。而an根据输入端type做相应的变化:
type == 0 , an = 0
type == 1 , an = an-1 + 1,a0 == 0
type == 2 , an = a1 + …… + an-1
并且要求有一个reset复位输入端实现同步复位的功能,且电路外观一定要如下(一定不同都不能有):
且要求是Moore状态机(输出值只与有限状态机当前状态值有关区别于Mealy状态机(输出值不仅同状态机当前状态值有关还与当前输入值有关)。
第一”坑“:因为如果左侧从上到下依次放输入,右端放一个输出的logisim默认电路外观是如下的图,在这种情况下评测机会以右侧输出端的绿线为支点,去按照上图的位置取输入的值,因此会导致下图中,左边中间的输入会对应到上图的左上输入端,其他以此类推,会得到意想不到的结果(本人是高位呈浮动数)。因此需要手动去调整,上机第一看:规定的电路外观,一定得要一模一样。
...



