BUAAOS-Lab6 Challenge
看看我的Shell!
实现记录由于我选择的是Lab6的挑战性任务,整体的子任务数较多,本人能力所限无法用一条完整的思路串联起所有的子任务,故为该节起名为:记录,还请看官海涵。这一部分基本按照osome平台上的任务顺序组织(虽然与实际实现历程有一定差异,我为了更方便对这些拓展功能进行测试,实际上先完成了对命令编辑功能的优化)。
实现由;分隔的一行多命令由于分号已经在sh.c中以宏定义的形式被加入到保留符号了,故只需要修改parsecmd()函数使其增添对于';'这一符号的处理能力即可。
本功能的具体思路就是当解析遇到一个’;’符号后,fork一个子shell,让子shell继续执行左边的命令,父shell等待子shell执行完成后,执行’;’符号右边的命令,具体的代码如下:
1234567891011121314case ';':; int child = fork(); // fork出两个进程 if(child) { // 父进程等待子进程执行完再执行';'右边的命令 if(re_alloc == 0){ ...
BUAAOS-Lab6实验报告
思考题Thinking 6.1
示例代码中,父进程操作管道的写端,子进程操作管道的读端。如果现在想让父进程作为“读者”,代码应当如何修改?
以下是修改后的代码:
12345678910111213141516171819202122232425262728293031#include<stdlib.h>#include<unistd.h>int fildes[2];char buf[100];int status;int main(){ status = pipe(fildes); if(status == -1){ printf("error\n"); } switch(fork()){ case -1: break; case 0: // 作为写者的子进程 close(fildes[0]); // 关闭不用的读端 write(fi ...
BUAAOS-Lab05实验报告
思考题Thinking 5.1
如果通过 kseg0 读写设备,那么对于设备的写入会缓存到 Cache 中。这是一种错误的行为,在实际编写代码的时候这么做会引发不可预知的问题。请思考:这么做会引发什么问题?对于不同种类的设备(如我们提到的串口设备和 IDE 磁盘)的操作会有差异吗?可以从缓存的性质和缓存更新的策略来考虑。
对于这个问题,可以分别站在读请求和写请求两个角度来考虑。
对于写请求,如果使用Write-Back策略对Cache进行更新,且通过kseg0段进行设备读写的话,假如说对某一个设备有连续的写入请求,那么在第一次读该设备I/O端口之前,我们的计算机所做的就只是不断地将Cache中映射到I/O端口的’dirty’表项进行更新,而不会真正写入到设备的I/O端口中去。
而对于读请求,以实验中的IDE磁盘为例,在对磁盘进行第n次连续写入的请求后(根据上述推理可知实际上并未进行这个写入操作),然后对上一次操作的状态返回值进行读取,而这时候可能会错误地从设备中返回一个非0值,而我们的写入操作并未实际执行,这样就产生了错误。
Thinking 5.2
查找代码中的相关定义,试回答一个 ...
BUAAOS-Lab4 实验报告
思考题Thinking 4.1
思考并回答下面的问题:
内核在保存现场的时候是如何避免破坏通用寄存器的?
系统陷入内核调用后可以直接从当时的 $a0-$a3 参数寄存器中得到用户调用 msyscall留下的信息吗?
我们是怎么做到让 sys 开头的函数“认为”我们提供了和用户调用 msyscall 时同样的参数的?
内核处理系统调用的过程对 Trapframe 做了哪些更改?这种修改对应的用户态的变化是什么?
答:
内核通过使用SAVE_ALL宏来保存现场,该宏的实现是这样的:
123456789101112131415161718192021move k0, spbltz sp, 1fli sp, KSTACKTOP1: subu sp, sp, TF_SIZE sw k0, TF_REG29(sp) // tf中的栈指针 mfc0 k0, CP0_STATUS sw k0, TF_STATUS(sp) mfc0 k0, CP0_CAUSE sw k0, TF_CAUSE(sp) mfc0 k0, C ...
BUAAOS-Lab1 实验报告
思考题Thinking 1.1
请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具链(gcc、ld、readelf、objdump等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu-前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参数的含义。
首先,我们使用objdump --help命令来查看-DS参数的含义,输出结果如下:
1234-D, --disassemble-all Display assembler contents of all sections// 含义为展示所有section的汇编内容-S, --source Intermix source code with disassembly// 同时显示机器源码与反汇编得到的汇编代码
也就是说,这里参数的含义是:展示二进制文件所有section的反汇编结果,并同时显示机器源码和反汇编得到的汇编代码。
使用原生x86工具链的操作流程与结果在指导书中已经十分清晰了,于是我在此不做复述,仅对使用mips交叉编译工具链的 ...
BUAAOS-Lab2 实验报告
思考题Thinking 2.1
Q:在编写的 C 程序中,指针变量中存储的地址是虚拟地址,还是物理地址?MIPS 汇编程序中 lw 和 sw 使用的是虚拟地址,还是物理地址?
A:
在编写的C程序中,指针变量中存储的地址是虚拟地址;
MIPS汇编程序中lw和sw使用的也是虚拟地址。
Thinking 2.2
Q1:从可重用性的角度,阐述用宏来实现链表的好处。Q2:查看实验环境中的 /usr/include/sys/queue.h,了解其中单向链表与循环链表的实现,比较它们与本实验中使用的双向链表,分析三者在插入与删除操作上的性能差异
A1:
用宏实现链表的好处可以通过将其与通过函数实现进行对比来体现。就我们实验中Page组成的链表为例:
12345678910struct Page{ Page_LIST_entry_t pp_link; /* pp_link{ struct Page *le_next; struct Page **le_prev; } */ ...
BUAAOS-Lab3 实验报告
思考题Thinking 3.1
请结合 MOS 中的页目录自映射应用解释代码中e->env_pgdir[PDX(UVPT)] = PADDR(e->env_pgdir) | PTE_V的含义。
在MOS中的页目录自映射应用中提到:而 MOS 中,将页表和页目录映射到了用户空间中的 0x7fc00000-0x80000000(共 4MB)区域,这意味着 MOS 中允许在用户态下通过 UVPT 访问当前进程的页表和页目录。结合mmu.h中的宏定义#define UVPT (ULIM - PDMAP),我们可以得知UVPT即为用户地址空间(虚存)中起始页表项的地址。
设映射到页目录自身的表项为页目录的第i项,页目录基地址为base1,页表基地址为UVPT基于自映射关系,我们可以得出如下关系式:
解得:
123i = UVPT >> 22;// 即:i = PDX(UVPT);
基于上述分析不难理解,这条语句是将页目录的起始物理地址自映射到对应的页目录项。
Thinking 3.2
elf_load_seg以函数指针的形式,接受外部自定义的回调函数 map_pa ...
BUAAOS-Lab0 实验报告
思考题Thinking 0.1题目太长,就不摘抄了。
对比 $Untracked.txt$ 和 $Stage.txt$ 的内容,可以发现,在对 $README.txt$ 文件进行 git add 之前,该文件处于 Untracked 状态,而在添加后则处于待提交状态,这说明该文件已经被添加到暂存区了。
观察 $Modified.txt$ 文件可以看到修改文件后,$README.txt$ 处于 Modified 状态,这是工作区文件和暂存区文件不一致造成的。
Thinking 0.2题目如下:
仔细看看0.10,思考一下箭头中的 add the file 、stage the file 和commit 分别对应的是 Git 里的哪些命令呢?
箭头 $Add the file$ 对应的git命令是:git add;箭头 $Stage the file$ 对应的git命令依然是:git add [filename];箭头 $Commit$ 对应的git命令是:git commit。
Thinking 0.3题目如下:1. 代码文件 print.c 被错误删除时,应当使用什么命令将其恢复? ...
快速上手LaTeX(二)------页面设置
本文主要参考文章:LaTeX入门(七)——页面设置
页面大小设置:geometry123456789101112131415\usepacage{geometry}% 设置页面长宽\geometry{a4paper}\geometry{paperheight=22cm, paperwidth=10cm} % 当然,也可以直接指定长宽数值% 版心定位% 版心位置参数有:left, right, top, bottom\geometry{left=2cm}% 版心居中参数有:vcentering(竖直居中), hcentering(水平居中), centering(水平、数值均居中)\geometry{centering}% 版心大小% 版心大小参数有:textheight, textwidth\geometry{textheight=20cm}
页眉页脚:fancyhdr1234567891011121314151617181920212223\usepackage& ...
快速上手LaTeX(一)------用LaTeX写一篇论文的基础框架
基本框架可以分为导言区和正文区
123456\document% 导言区,用于用\usepacage指令引入各种宏包\begin{document}% 正文区,用于编写正文\end{document}
文章层次结构层次结构的划分层次结构主要使用\section{}和\subsection{}命令来进行标记。
1234567\section{一级标题} \subsection{二级标题} \subsubsection{三级标题} \subsection{第二个二级标题}
利用已经划分好的层次结构生成目录在经过上述命令的使用构造好章节结构后,可以使用\tableofcontents命令在指定的位置生成目录。
123% 生成目录页\tableofcontents\newpage
插入图片在latex中插入图片需要使用graphicx宏包,建议使用形式:
12345\begin{figu ...