BUAA-OS-Lab2
Lab2:内存管理[toc]
访存流程概览内核态内核态是操作系统运行的一种状态,与用户态相对,在这种状态下,计算机系统赋予了操作系统内核最高的权限。包括但不限于:
拥有最高权限:CPU可执行指令集中的所有指令,包括特权指令,进而直接访问和控制关键资源和硬件。
访问所有内存空间。
处理中断和异常。
系统资源管理:如CPU时间片分配,进程的创建与销毁等。
内存布局在我们设计的MOS操作系统中,内存的布局以及虚实映射关系如下:
虚拟地址:0x00000000 ~ 0x7fffffff(kuseg),这2GB空间用于存放用户程序代码与数据。需要通过TLB转化为物理地址,再通过cache访存。
虚拟地址:0x80000000 ~ 0x9fffffff(kseg0),这512MB空间用于存放内核代码与数据。将虚拟地址的最高位置零得到物理地址,通过cache访存。
虚拟地址:0xa0000000 ~ 0xbfffffff(kseg1),这512MB空间可以用于访问外存,将虚拟地址的最高三位置零得到物理地址,不通过cache访存
虚拟地址:0xc0000000 ~ 0xffffffff(kseg ...
BUAA-OS-Lab1
Lab1:操作系统的内核,启动[toc]
ELF——操作系统内核的本质
链接器通过哪些信息来链接多个目标文件呢?
在目标文件中,记录了代码各个段的具体信息。链接器通过这些信息来将目标文件链接到一起。
ELF是一种用于可重定位文件(如目标文件),可执行文件和共享对象文件的文件格式
可执行文件:包含完整程序(所有跳转地址都已确认,可被操作系统直接加载到内存运行),有明确的入口地址。具有程序头表,操作系统据此将文件映射到内存。
可重定位文件:包含一些尚未确定具体地址的符号,需要在链接过程中重定位。
共享对象文件:代码和数据可被多个程序同时使用,从而减少内存使用。:共享对象文件在程序运行时才会被加载到内存中,而不是在链接时静态地合并到可执行文件中,这样可以省去重复编译。
elf.h是一个头文件,在类Unix系统里,它定义了ELF文件格式的各种数据结构与常量。借助elf.h我们能够编写程序来读取,解析,操作ELF文件。
12345678910111213141516typedef struct { unsigned char e_ident[EI_NIDENT ...
[BUAA-OO]第一单元:表达式化简
[BUAA-OO] 第一单元:表达式展开[toc]
概述 面向对象课第一单元的主题是表达式展开和化简,主要考察的内容是面向对象设计的思想,具体体现为表达式(Expr),项(Term)等类的构建和它们的对象,方法的管理。第一单元共有三次迭代任务,分别是:
单变量单层括号的多项式展开
含有自定义递推函数,三角函数,多层括号的多项式展开和化简
含有自定义普通函数的多项式展开,求导和化简
客观来说,第一次作业由于是从零开始构建,难点主要在于理解递归下降的到底要做什么,以及怎么实现递归下降解析。第二次作业的难度和码量同步达到了巅峰,三角函数的引入改变了多项式最基本组成单元的形式,递推函数的引入大大增加了解析和计算的难度,多层括号可能意味着递归层数的加深。第三次作业的难点主要在于求导的设计。下面我们具体来回顾和总结第一单元的开发。
UML类图和度量分析 第一单元作业的类图如下:
在本次作业中,我总共创建了17个类或接口的实现,共1600余行代码。在此具体解释一下每个类的设计考虑:
1234567891011121314151617181920212223 ...
[BUAA-OS]Lab0
Hello Linux!
Hello Linux围绕Linux基础操作,Linux下的开发工具,Linux操作补充,Shell Script四个部分展开
[toc]
Linux基础操作
ls:
1234ls [选项] [文件]选项:-a 显示包括隐藏项目在内的所有项目-l 列出文件详细信息,每行一个文件
touch
1touch [选项] [文件名] 创建新文件或更新现有文件时间戳
mkdir 和 rmdir
12mkdir [选项] 目录名 创建新文件夹/目录rmdir [选项] 目录名 删除空文件夹/空目录
pwd
1pwd 查看当前绝对路径 一般从/home开始显示
cd
1cd [选项] 目录名 跳转到指定目录
rm
12345rm [选项] 文件名选项:-r 递归删除目录及其内容,删除一个非空目录必须加-r-f 强制删除不提示确认-i 交互式(即总是会询问用户是否确定删除)
使用 rm 命令要格外小心,因为一旦删除了一个文件,就无法再恢复它。一些用户 会在家目录下建一个类似回收站的目录,如果要使用rm命令,先把要删除的文件 移到这个目录里, ...
[BUAA-OO]第一单元第1次作业
BUAA-OO 第一单元第一次作业[toc]
第一次作业主要是关于单变量多项式的展开,这次我们需要展开的表达式中项只有三种——幂函数,常数因子和表达式因子。我们的输出不能有括号,并且还要尽可能的简单。
思路概述
我们首先通过标准输入获得一个符合规范的表达式,并将其以String的类型传入lexer进行词法解析,获得一系列词块(token)。
然后我们利用递归下降的方法将token组合起来,自底向上形成一个个符合规范的factor,term,expression。
通过建立多项式类(Poly),单项式类(Mono)和实现它们的加,减,乘,幂运算方法来展开表达式。
最后还需要对输出结果做一定的化简。
代码UML类图
词法解析 词法解析中用到的lexer类沿用了OOpre_hw7中的设计思路,它具有如下属性:
1234public class Lexer { private ArrayList<Token> tokens = new ArrayList<>(); private int index = 0;}
...
BUAA_CO_P6习题分析
P6 习题分析
wtd指令:
记temp1为GRF[rs]的32种循环移位的和 如: 123 + 231 + 321
temp2为GRF[rt]的32种循环移位的和
if (temp1 > temp2) 则 把1写入rd
else if (temp1 < temp2) 则 把 -1写入rd
else 把0写入rd
12345678910111213141516171819202122232425262728293031323334353637383940/* 整体分析:在D级实现一个组合逻辑计算出temp1和temp2,进而确定回写内容 */controllerwire wtd = (opcode_DEin == 6'b0 && func_DEin == 6'b000011) ? 1 : 0;/* 生成控制信号 */RegWrite_DEin = (wtd || ...) ? 1 : 0;RegDst_DEin = (wtd || ...) ? 2'b01 : ... // 写入rd寄存器/* 生成特判信号 */wir ...
BUAA_CO_P7
MIPS微系统
P7需要我们的CPU支持异常处理。
具体地说,就是在“异常事件”发生的时候,调用一段预先写好的程序来处理这种异常,处理结束后再跳转回原来的程序。
P7新增了4条与系统相关的指令:mfc0 mtc0 eret syscall
概念异常事件我们提到的“异常事件”有两种:异常和中断
(内部)异常:
加法溢出
除法除零
(外部)中断:
计时器信号
键盘输入
系统桥系统桥是连接CPU和外设的功能设备,它会给 CPU 提供一种接口,使得 CPU 可以像读写普通存储器一样(即按地址读写)来读写复杂多变的外设。
系统桥统一且简化了 CPU 的对外接口,CPU 不必为每种外设单独提供接口,符合高内聚,低耦合的设计思想。
将CPU封装成单周期对于CPU的外部来说,它并不关心流水线中有多少条指令,是否阻塞等问题。
他们可以简单的认为CPU就是每次处理一条指令的“单周期”的。这是理解流水线CPU封装的关键所在。
CP0协处理器
CP0的两个功能:读写内部寄存器(mfc0 mtc0)+ 判断是否进行异常跳转
读写内部寄存器
有哪些寄存器?
| 寄存器 | 位数 | 编号 ...
BUAA_CO_P6
P6支持30指令的五级全速流水线指令分析29条指令
计算类指令:add sub and or slt sltu lui addi andi ori nop
访存类指令:lb lh lw sb sh sw
乘除类指令:mult multu div divu mfhi mflo mthi mtlo
分支类指令:beq bne
跳转类指令: jal jr
数据冒险需要回写的有16条指令:add sub and or slt sltu lui addi andi ori lb lh lw mfhi mflo jal
转发阻塞Tuse : 在D级用数据为0,E级为1,M级为2,用不到数据为max(在编写时,max = 3)
add
sub
and
or
slt
sltu
lui
addi
andi
ori
nop
Tuse_RS
1
1
1
1
1
1
max
1
1
1
max
Tuse_RT
1
1
1
1
1
1
max
max
max
max
max
lb
lh
lw
sb
sh
sw
beq
bne
jal
jr
Tuse_RS
1 ...
BUAA_CO_P5习题分析
增添指令注意事项:
注意必须在每一级的WriteBack和RegAddr检查回写的内容和地址是否符合新增指令的期望,防止在上游产生的正确回写数据在下游被覆盖!
注意务必为新增指令添加阻塞板块Tuse Tnew的取值。
由于特判信号是随着指令在流水线中流动的,所以其后也要加_DEin这样的后缀。
注意默认拓展是0拓展,要进行符号拓展需要将新增指令的特判信号传入EXTOp。
运算类(1) 运算 + 判断 + 回写(地址确定)
P4T1添加指令为 eam,R型指令。具体操作为,取出 GPR[rs] 的低16位,作为一个有符号数对17取模,结果必须为0~16的某一个非负数,结果为一个16位的数。之后,若 GPR[rt] 的最高位为1,则将该运算结果零扩展至32位,否则将该运算结果一扩展至32位。将结果存至 GPR[rd] 中。
1234567891011121314151617181920212223242526272829/* 整体分析:该题对GRF[rs]取值计算,根据GRF[rt]的最高位决定回写内容,存于固定地址根据尽早产生数据的原则,我们希望利用D级内的组合逻辑得到正确的要回 ...
BUAA_CO_P5
P5_流水线CPU指令分析支持10指令
运算类:add sub nop lui ori
访存类:sw lw
分支跳转类:beq jal jr
数据冒险阻塞根据转发中的第2,3点分析,我们知道每条指令都有相应的产生新数据的时间Tnew(从刚进入D级算起,如果有的话),也有需要用到数据的时间Tuse(从刚进入D级算起,如果有的话)。这样就会构成如下的表格:
如果用不到数据我们就认为是一个很大的时间max(3)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tuse_RS
1
1
max
1
max
1
1
0
max
0
Tuse_RT
1
1
max
max
max
2
max
0
max
max
另一个指标是Tnew,用于体现要回写的新数据产生并存入最近的流水级寄存器堆的时间(从刚进入D级算起)
如果不会产生要回写的数据就记为一个很小的时间min(0)
add
sub
nop
ori
lui
sw
lw
beq
jal
jr
Tnew_DEin
2
2
min
2
1
min
3
min
1
min
...