OS_Challenge_SWAP 实现报告
前言
SWAP
挑战性任务主要关于内存管理、进程调度与外设访问,基本只涉及内核的改动,要求对以上的知识有充足的认识与深刻的理解。代码改动总体上不算多(相较于
SHELL 挑战性任务),但根据自己的感受以及别人的描述是 SWAP
任务的思考量相对来说比较大, SHELL
代码量大但是是挑战性任务中思考量最小的一个。我自己花了大概 3
天的时间实现指导书上的所有操作 +
过编译(仅仅只是过编译,很多实现因为理解不到位都有错误),然后花了 3
天的时间 debug。
我在实现的过程中,pmap.c 改动的内容是最多的,因为其涉及
swap_out、swap_in 以及 TLB
重填逻辑等有关 SWAP 核心机制的实现。ide.c
和 ide.h 是我新增的文件,因为当前 MOS
中对外设的访问是通过文件系统实现的(Lab5
内容),其属于用户进程,并不方便内核去使用,且关键问题在于:Lab5 实现的文件系统是对主 IDE
控制器进行访问的,而 SWAP 挂载的磁盘 swap_disk
由从 IDE...
OS LAB5 文件系统
思考题
Thinking 5.1 如果通过 kseg0 读写设备,那么对于设备的写入会缓存到
Cache 中。这是
一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做
这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE
磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
当外部设备自身更新数据时,如果此时 CPU
写入外设的数据还只在缓存中,则缓存的那部分数据就只能在外设自身更新后再写入外设(只有缓存块将要被新进入的数据取代时,缓存数据才会被写入内存),这样就会发生错误的行为。
对于串口这类实时交互设备,问题表现为明显的 I/O
延迟和丢失。对于IDE
磁盘这类块设备,问题可能导致命令执行失败、磁盘状态混乱,最严重的是静默数据损坏,危害性极大且难以排查。
Thinking 5.2
查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制
块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
在 user/include/fs.h...
OS LAB4 系统调用与fork
思考题
Thinking 4.1 思考并回答下面的问题:
•内核在保存现场的时候是如何避免破坏通用寄存器的?
•系统陷入内核调用后可以直接从当时的$a0-$a3 参数寄存器中得到用户调用
msyscall 留下的信息吗?
•我们是怎么做到让 sys 开头的函数“认为”我们提供了和用户调用 msyscall
时同样的参数的?
•内核处理系统调用的过程对 Trapframe
做了哪些更改?这种修改对应的用户态的变化是什么?
内核使用宏函数 SAVE_ALL
来保存现场,在该函数的代码实现里,只使用了 k0 和 k1
两个通用寄存器来进行操作,从而保证其他通用寄存器的值都不会被改变。
可以。因为内核在陷入内核、保存现场的过程中,寄存器$a0-$a3
中的值都没有被破坏。
用户在调用 msyscall 时,传入的参数会被保存在$a0-$a3
寄存器和堆栈中。当陷入内核时,$a0-$a3
寄存器不会被破坏,而且用户栈中的内容会被原封不动地被拷贝到内核栈中。因此,sys_*
函数可以从寄存器和内核栈获得”用户调用...
OS LAB3 进程与异常
思考题
Thinking 3.1 请结合 MOS 中的页目录自映射应用解释代码中
e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义。
一个页目录项映射一个含有 1K 个页表项的 4KB 页表,每一个页表映射一个
4MB 大小的虚拟地址空间。由于页目录映射的 4MB 空间就是二级页表结构所在的
4MB 空间,而用户二级页表结构存储在虚拟地址空间中的 UVPT 至 ULIM 处的 4MB
空间 ,因此页目录相当于第 PDX(UVPT)(取高 10
位)个页表,也就位于第 PDX(UVPT) 个页目录项,其物理地址
PADDR(e->env_pgdir) 存储在这个页目录项中。
Thinking 3.2 elf_load_seg 以函数指针的形式,接受外部自定义的回调函数
map_page。请你找到与之相关的 data
这一参数在此处的来源,并思考它的作用。没有这个参数可不可以?为什么?
int elf_load_seg(Elf32_Phdr *ph,...
OS LAB2 内存管理
思考题
Thinking 2.1 请根据上述说明,回答问题:在编写的 C
程序中,指针变量中存储的地址被视为虚拟地址,还是物理地址?MIPS
汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址,还是物理地址?
虚拟地址;虚拟地址。
Thinking 2.2 请思考下述两个问题:
•...
OS LAB1 内核、启动和printf
思考题
Thinking 1.1
在阅读附录中的编译链接详解以及本章内容后,尝试分别使用实验环境中的原生
x86 工具链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有
mips-linux-gnu- 前缀,如
mips-linux-gnu-gcc、mips-linux-gnu-ld),重复其中的编译和解析过程,观察相应的结果,并解释其中向
objdump 传入的参数的含义。
不同工具链的比较
使用 gcc -E hello.c > ori_prep.txt 和
mips-linux-gnu-gcc -E hello.c > cross_prep.txt,获取原生
x86 工具链和 MIPS 交叉编译工具链对于 hello.c
的预处理结果,并通过命令
diff ori_prep.txt cross_prep.txt -y
比较两个预处理结果的不同。可以看到不同工具链使用的工具路径不同、对某些变量的定义不同等。
工具路径不同:
1234567891011# 0...
OO Unit2 多线程
架构设计
黄色部分为第一次作业的类,红色部分为第二次作业新增类,紫色部分为第三次作业新增类。
架构迭代
第一次作业
整体采用了生产者-消费者的设计模式。考虑到第一次作业指定了乘客请求的电梯,我并没有设置调度器线程,而是输入线程
inputThread
读取到乘客请求后直接放入每个电梯各自的乘客请求处理队列
processingQueue。电梯运行采用 LOOK
策略,电梯线程 elevatorThread 每执行完一个动作后从自己的
processingQueue
中取出一个乘客请求,并结合自身的信息发送给策略类
Strategy,获取下一动作 advice 并执行。
第二次作业
第二次作业新增了临时调度请求,并取消了乘客请求指定电梯,即需要调度给某部电梯来运送乘客。因此在第二次作业中,我新增了全局的请求队列
requestQueue,并由调度器线程 dispatchThread
来将请求分配给某部电梯,放入其请求处理队列
processingQueue,随后电梯线程...
OO Unit1 表达式解析
基于度量分析程序结构
类图
Unit1
最终版本的类图如上图所示。整个程序的核心思想采用了递归下降法,大体流程是:对于输入数据
input,先在 Main 方法中依次调用类
ComFunc 的 defineComFunc 静态方法和
RecFunc 的 defineRecFunc
静态方法,解析自定义普通函数和自定义递推函数,然后再解析待展开表达式:实例化一个
Lexer
对象,实现词法解析,并将解析的结果传递到
Parse
的实例对象,实现语法解析,解析得到一个
Expr 实例 expr,然后再将 expr
转为 Poly(由 Unit
构成)的多项式形式,并在转化的过程中实现表达式的计算(实体类
Poly 与 Unit)与化简(工具类
Simplify),
最后将结果作为字符串输出。
度量
IntelliJ IDEA 的插件 MetricsReloaded
帮助计算了以下方法度量值,故在此围绕这些度量进行分析。
CogC(Cognitive Complexity,认知复杂度)
CogC...
P7 CPU设计文档
设计草稿
任务清单
流水线 CPU 为计时器模块(已实现)提供接口
创建系统桥模块,为 CPU
提供统一的访问外设的接口
创建协处理器 CP0模块,用于引导 CPU
执行异常处理程序
使 CPU 能够检测内部指令执行的错误
使 CPU 能够初步响应外部的中断信号
在 CPU 中实现一些异常处理需要执行的指令
注:
CPU(包含 CP0)、Bridge 和 2 个计时器
Timer1、Timer2都是MIPS
微系统的组成部分,也即我们需要设计搭建的系统模块;而
DM 和中断产生器是外部的设备,由外部(testbench)传入,与我们无关。
对于 Bridge 来说,Timer1、Timer2 和
InterruptGenerator...
P6 CPU设计文档
设计要求
处理器应为五级流水线设计,支持如下指令集:
12345add, sub, and, or, slt, sltu, luiaddi, andi, orilb, lh, lw, sb, sh, swmult, multu, div, divu, mfhi, mflo, mthi, mtlobeq, bne, jal, jr
请注意,所有运算类指令均暂不考虑因溢出而产生的异常。
除加减法外的指令均以指令集规定的行为为准,可参看 MIPS-C
指令集(该指令集描述针对单周期,注意单周期和流水线有些许指令行为描述不同,但最终结果是一致的),加减法按无符号处理(不考虑溢出)。若对本次实验有任何疑问请及时在讨论区提出。
设计草稿
新增指令 AT 信息
新增指令顺序:
先加入涉及 MUDI
的乘除法指令,完善相应的数据通路及(冒险)控制信号;
再加入涉及 ALU 的运算指令,对 ALU
做出相应修改;
再加入访存指令,新增 BE 扩展模块与 RE 扩展模块;
最后加入跳转指令,修改 CMP...