OS_Lab5_实验报告
Lab5_实验报告一、思考题Thinking 5.1如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是 一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做 这会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)、的操作会 有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
1.访问内核时错误读取到设备内容2.外设可能随时更新,如果在上一次缓存过后,设备的值已经发生了改变,但系统读取外设时先在 Cache 中查找到设备后返回缓存的值,那么通过缓存会访问到落后内容。
串口设备由于即时性与高使用频率,会比IDE磁盘更容易出现这样的错误
Thinking 5.2查找代码中的相关定义,试回答一个磁盘块中最多能存储多少个文件控制块?一个目录下最多能有多少个文件?我们的文件系统支持的单个文件最大为多大?
123456789101112#define FILE_STRUCT_SIZE 256struct File { char f_name[MAXNAMELEN]; // filename uint32_t f ...
OS_Lab4_实验报告
Lab4_实验报告一、思考题Thinking 4.1 内核在保存现场的时候是如何避免破坏通用寄存器的?
内核在kern/entry.S异常入口处使用宏函数SAVE ALL保存通用寄存器和部分CP0寄存器,其中只使用k0和k1寄存器来操作,不会破坏其他通用寄存器
系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall 留下的信息吗?
我觉得需要分类讨论,理由如下:
陷入内核调用时
kern\entry.S在SAVE_ALL生成一个Trapeframe 并把sp 指向 Trapframe 的底部
12345678910exc_gen_entry: SAVE_ALL mfc0 t0, CP0_STATUS and t0, t0, ~(STATUS_UM | STATUS_EXL | STATUS_IE) mtc0 t0, CP0_STATUS/* Exercise 3.9: Your code here. */ mfc0 t0, CP0_CAUSE andi t0, 0x7c lw t0, exception_handler ...
OO_Unit3
一、测试过程1.黑箱测试 黑箱测试是一种基于需求和功能规格的测试方法,测试人员不需要了解系统内部的实现细节,主要关注系统的输入和输出,通过输入数据来检查系统是否按照预期的方式运行,并验证输出是否符合预期。
优点是可以从用户的角度出发,更好地模拟用户实际使用系统的情况。缺点是可能无法覆盖系统的所有代码路径,以及对代码质量的评估不够深入。
2.白箱测试 白箱测试是一种基于代码内部结构和逻辑的测试方法,测试人员需要了解系统的内部实现细节,通过检查代码的逻辑路径、分支覆盖率等指标来评估代码的质量,并进行相应的测试。优点是可以更全面地覆盖代码,发现潜在的逻辑错误。
3.单元测试 单元测试是针对软件中的最小可测试单元进行的测试,旨在验证单个单元(通常是函数、方法或类)的功能是否按照预期工作,并尽可能地覆盖不同的代码路径和边界情况。例如我们写了三次的亲爱的Junit,真的是太实用了 (๑•̀ㅂ•́)و✧
4.功能测试 功能测试是通过模拟用户操作来验证系统功能是否符合需求和规格说明,需要尽可能覆盖整个系统的功能,验证系统的输入与输出是否符合预期。我理解可能是把所有指令都测一遍(?
5.集成 ...
OS_Lab3_实验报告
Lab3_实验报告一、思考题Thinking 3.1请结合 MOS 中的页目录自映射应用解释代码中 e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V 的含义
e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V
UVPT是用户新建进程页表虚拟地址的起始地址
其表示将页目录中第PDX(UVPT)个页表项映射到页目录本身的物理地址,并设置有效位。
目的旨在在用户内存空间中划分出一部分,使得用户可以通过访问这部分空间得到二级页表以及页目录中的数据
因为在UVPT-ULIM之间的4MB空间的va 它们的PDX(va) = PDX(UVPT) = 0x1ff
如图我访问一级页表的时候 查一级页表得到的二级页表基地址就是页目录的物理地址,进入到的二级页表即页目录本身
通过 PTX(va) 计算二级页表索引,访问了页目录项所对应的二级页表的内容
如果PTX(va) = PDX(va) 那么就会访问页目录本身
Thinking ...
OO_Unit2
一、架构设计迭代1.hw51.1 类图
1.2 时序图
1.3 架构分析(变不变)深入贯彻落实**”今朝有酒今朝醉”的原则,在博览博客之后,发现都说去年LOOK+自由竞争是活少分高**的不二选择✧(≖ ◡ ≖✿)
我果断加入LOOK大家庭,结(zhao)合(chao)实验代码,草率搓出了第一版
Main运行InputThread输入线程、Schedule调度器(我其实之前耦合在输入线程里面)、Elevator电梯线程
共享的数据类型只有Pesron记录人员请求信息、RequestTable管理人员请求信息
策略类Strategy,采用LOOK算法
梦幻开局,我还天真的认为:电梯月?就这??(๑>ڡ<)☆
1.4 调度器设计1234567891011121314151617@Overridepublic void run() { while (true) { if (mainRequestTable.isEmpty() && mainRequestTable.isEnd()) { for ...
OS_Lab2_实验报告
Lab2_实验报告一、思考题Thinking 2.1
在编写的 C 程序中,指针变量中存储的地址被视为虚拟地址
MIPS 汇编程序中 lw 和 sw 指令使用的地址被视为虚拟地址
Thinking 2.2
从可重用性的角度,阐述用宏来实现链表的好处
C 语言并没有泛型的语法,用宏来实现含有不同类型结构体的链表,可以提高代码的可重用性,可读性更高
查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异
单向链表
循环链表
双向链表
Add before first node
O(1)
O(1)
O(1)
Add before given node
O(n)
O(n)
O(1)
Add after given node
O(1)
O(1)
O(1)
Add after last node
O(n)
O(1)
O(1)
delet first node
O(1)
O(1)
O(1)
del ...
OS_Lab1_实验报告
Lab1_实验报告一、思考题Thinking 1.1
尝试分别使用实验环境中的原生 x86 工具链和 MIPS 交叉编译工具链,重复其中的编译和解析过程,观察相应的结果
(1)原生 x86 工具链
1.只进行预处理gcc -E hello.c,这 里一阶段并没有 printf 这一函数的定义
12345678/* 保留部分输出 */extern int printf (const char *__restrict __format, ...);# 2 "hello.c"int main(){printf("Hello World!\n");return 0;}
2.只编译而不链接 gcc -c hello.c 并进行反汇编 objdump -DS hello.o,printf 的具体实现依然不在我们的程序中
123456789100000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 ...
OO_Unit1
一、架构设计迭代1.hw11.1 UML类图
1.2 架构分析海量阅读往年优秀博客后(◔‸◔)后,我的架构主要仿照Unit1_training的提示以及oolens递归下降的代码仓库,如下处理:
表达式预处理
Predeal类中对输入字符串一键replaceAll
去除空白项
去除冗余++/–/+-/-+
去除冗余+(*+ /^+)
表达式解析
递归下降法构建Lexer类和Paser类
PaserExpr()、PaserTerm()、PaserFactor()层层深入
解析得到表达式类Expr、项类Term、因子Fatcor
因子统一接口Factor 实现类
VarFactor幂函数因子 ,定义为x^a
ExprFactor表达式因子 ,定义为(expression)^a
NumberFactor常数因子
这里我解析Term的时候没有为其加入符号属性,而是直接遇到负号就为term加入一个值为-1的NumberFactor
基本单元定义
单项式类Mono、多项式类Poly定义如下:$$Mono = a*x^b\Poly = ...
OS_Lab0_实验报告
Lab0 实验报告一、思考题Thinking 0.1
执行命令 cat Untracked.txt 和 cat Stage.txt,对比两次运行的结果,体会 README.txt 两次所处位置的不同
git add之后README.txt添加到了暂存区
执行命令 cat Modified.txt,观察其结果和第一次执行 add 命令之前的 status 是 否一样,并思考原因。
这两个status不一样,Untracked.txt中显示README.txt是未跟踪的文件(Untracked). Modified.txt中显示此时README.txt是尚未暂存以备提交的变更(Modified)
原因:第一次add以前,新建的README.txt不在暂存区,是Untracked状态.。而随后进行了git add后变为Staged 状态,git commit后变为Unmodified状态,修改后就变为Modified状态,修改后尚未加入提交。
Thinking 0.2
add the file 对应 git add <filename>
文件状态从未跟踪到已暂存,表 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment