SchoolWork-LaTeX/操作系统/实验报告/Lab1.tex

65 lines
7.1 KiB
TeX
Raw Normal View History

2024-09-02 17:47:53 +08:00
\documentclass[a4paper]{ctexart}
\input{mypreamble}
\renewcommand{\mylabname}{系统软件启动过程}
\renewcommand{\mydate}{2024年3月26日}
\begin{document}
\mytitle
\begin{enumerate}
\myitem{完成相关实验内容后,回答以下问题:}{
\questionandanswer[]{
为何要开启A20 uCore OS是如何开启A20的
}{
如果不开启A20会导致地址线第21位永远为0无法完整进行内存寻址。uCore OS通过向8042键盘控制器的命令端口和数据端口发送命令和数据来开启A20。
}
\questionandanswer[]{
试分析段描述符表GDT 的结构说明段描述符中每个字段的含义以及作用。uCore OS是如何初始化GDT表的
}{
% 段选择子的每个元素为16位前13位是INDEX表示这个段选择子在GDT数组或LDT数组的索引号第14位是Table Indicator这个值为0表示查找GDT1则查找LDT最后两位是Request Privilege Level表示以什么样的权限去访问段。
\begin{center}
\includegraphics[width=1\linewidth]{imgs/2024-03-26-21-17-25.png}
\end{center}
uCore OS初始化了一个空的表项、一个内核代码段、一个内核数据段。
}
\questionandanswer[]{
实模式和保护模式有何不同uCore OS是如何使能和进入保护模式的
}{
实模式的寻址范围不超过1M并且没有分段机制等而保护模式的寻址范围则没有1M的限制并且可以实现分段机制等。uCore OS通过把控制寄存器的0位设置成1来使能和进入保护模式。
}
\questionandanswer[]{
Bootloader是如何利用ELF文件头的相关属性加载和运行uCore OS Kernel的
}{
首先判断文件头的e\_magic是否等于ELF\_MAGIC之后根据e\_phoff找到程序头表的位置在程序头表中找到分段数和各个分段的偏移位置、大小接着把各个分段加载到内存中最后跳转到e\_entry入口开始执行。
}
\questionandanswer[]{
分析中断描述符表IDT的结构说明中断描述符中每个字段的含义以及作用。 uCore OS是如何实现中断机制的
}{
中断描述符表中的每个表项称为中断描述符,它可以确定相应的中断处理程序的位置,中断描述符的结构和每个字段的含义以及作用如下:
\begin{center}
\includegraphics[width=1\linewidth]{imgs/IDT1.png}
\includegraphics[width=1\linewidth]{imgs/IDT2.png}
\end{center}
它确定了段选择子、段内偏移、该段是否已调入内存、该中断的特权级、中断类型(中断门或者陷阱门)等。
uCore OS将每个中断门都初始化为带中断号参数的调用最后调用trap.c中的内容之后把系统调用的中断门的特权级设置为用户态最后加载中断描述符表寄存器。
}
}
\myitem{程序设计与实现的基本思路}{
\item 大部分实现的功能在trap.c文件中首先从实验视频中可以得知在触发中断后会进入trap.c的执行流程之后根据不同的中断号执行不同的流程由于题目要求通过键盘中断实现计时器因此主要关注键盘中断和时钟中断
\item 根据题意在键盘按下S时开始P暂停E停止C继续A正计时B倒计时。那么首先考虑键盘中断这里很明显很适合用switch语句根据键盘中断后得到的字符不同执行不同的流程
\item 这里还需要注意整个功能是存在不同的状态的其实是因为单线程才会有这么多状态如果多线程都不需要考虑状态事件驱动就行首先很明显可以知道有正在计时状态和停止状态。然后我们考虑这两个状态会在什么时候互相转化从停止状态转到开始状态可以是按下S或者C从开始状态转到停止状态可以是按下P或E或者是倒计时到0了。而且题目需要实现正计时和倒计时这是两种不同的模式因此还需要一个状态变量记录当前的模式通过按A和B切换
\item 还要注意当按了B后进入倒计时此时要输入时间但是这时候还没有gets等函数的实现需要自己通过键盘中断进行输入那么在键盘中断的时候就不仅需要捕获字母也需要捕获数字但我们不希望在输入数字的时候不小心输入了字母就打断了数字输入这时候就需要增加状态了需要一个状态表示正在输入数字在按下B后切换到这个状态当按下Enter后切换到计时状态或停止状态
\item 当倒计时到0的时候应该切换到停止状态并且还需要输出一条信息表示当前计时到0了但是这里就要注意从计时状态切换到停止状态时不应该输出这条信息因此这里需要多加一个中间状态用来表示倒计时结束的准备输出这个状态在下一次时钟中断可以类比数字逻辑电路中同步时序电路在时钟有效边沿到来时转换到停止状态并且输出这条信息
\item 关于检测频率原先的计时器在每次时钟中断时执行ticks++而时钟中断频率在clock.c文件中设置的是时钟频率除以100也就是每0.01秒触发一次尝试过改成除以1000但会导致走时变慢应该是因为触发中断太频繁了时间开销太大也尝试过改成除以10又会导致走时过快看来还是原始的除以100最准时
\item 既然每0.01秒触发一次中断那么如果是每TICK\_NUM次中断打印一次时间直观感受就是精度为 TICK\_NUM * 0.01 秒按照题目要求那么TICK\_NUM应该取10当然为了提升精度也可以取更小比如1
\item 当键入退格时字符为$\backslash$b用于在输入数字时进行退格当键入回车时字符为$\backslash$n用于确定倒计时的时间循环打印时间时需要使用$\backslash$r表示将光标回到当前行的开头这样再打印时间就会把之前的时间覆盖掉
\item 当然还存在一些bug比如从10.000倒计时到9.990时就会无法覆盖最后一个0导致看起来是9.9900还有时间精度还是不准的问题欢迎给出修复建议可以通过Issue的方式下面会给出网址
}
\myitem{代码}{
\item \url{https://gitea.shuishan.net.cn/10213903403/os_kernel_lab}
\item 也可以看上传的附件。
}
注:\mycircle{1} 要求实验报告以及代码以附件形式提交。
\mycircle{2} 实验报告提交的截止期为4月1日。
\end{enumerate}
\end{document}