File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 127127 输出一些带有颜色的字符串,并尝试直接使用 `print! ` 宏输出一到两个相同的效果。
128128
129129 尝试输出如下格式和内容:
130+
130131 - `INFO : Hello , world! `,其中 `INFO : ` 为绿色,后续内容为白色
131132 - `WARNING : I 'm a teapot! `,颜色为黄色,加粗,并为 `WARNING ` 添加下划线
132133 - `ERROR : KERNEL PANIC !!! `,颜色为红色,加粗,并尝试让这一行在控制行窗口居中
1371384 . 使用 `enum ` 对类型实现同一化
138139
139140 实现一个名为 `Shape ` 的枚举,并为它实现 `pub fn area (& self ) -> f64 ` 方法,用于计算不同形状的面积。
141+
140142 - 你可能需要使用模式匹配来达到相应的功能
141143 - 请实现 `Rectangle ` 和 `Circle ` 两种 `Shape `,并使得 `area ` 函数能够正确计算它们的面积
142144 - 使得你的实现能够通过如下测试:
1601625 . 实现一个元组结构体 `UniqueId (u16 )`
161163
162164 使得每次调用 `UniqueId :: new ()` 时总会得到一个新的不重复的 `UniqueId `。
165+
163166 - 你可以在函数体中定义 `static ` 变量来存储一些全局状态
164167 - 你可以尝试使用 `std :: sync :: atomic :: AtomicU16 ` 来确保多线程下的正确性(无需进行验证,相关原理将在 Lab 5 介绍,此处不做要求)
165168 - 使得你的实现能够通过如下测试:
Original file line number Diff line number Diff line change @@ -211,6 +211,7 @@ impl XApic {
211211 Local Vector Table 寄存器用于设置中断向量号和触发模式。它们的位描述如下:
212212
213213 <table class="inst"><tr><td class="inst-numnode"colspan="4"><td class="inst-numnodel">31<td class="inst-numnode"colspan="8"><td class="inst-numnoder">18<td class="inst-numnoder">17<td class="inst-numnoder">16<td class="inst-numnoder">15<td class="inst-numnoder">14<td class="inst-numnoder">13<td class="inst-numnoder">12<td class="inst-numnoder">11<td class="inst-numnode"colspan="2"><td class="inst-numnoder">8<td class="inst-numnode"colspan="3"><td class="inst-numnoder">0<tr><td colspan="4">Timer<td class="inst-node-little"colspan="10">-<td class="inst-node-little"colspan="1">TP<td class="inst-node-little"colspan="1">M<td class="inst-node-little"colspan="3">-<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="4">-<td class="inst-node-little"colspan="4">Vector<tr><td colspan="4">LINT0<td class="inst-node-little"colspan="11">-<td class="inst-node-little"colspan="1">M<td class="inst-node-little"colspan="1">TM<td class="inst-node-little"colspan="1">RI<td class="inst-node-little"colspan="1">IP<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="1">-<td class="inst-node-little"colspan="3">DMode<td class="inst-node-little"colspan="4">Vector<tr><td colspan="4">LINT1<td class="inst-node-little"colspan="11">-<td class="inst-node-little"colspan="1">M<td class="inst-node-little"colspan="1">TM<td class="inst-node-little"colspan="1">RI<td class="inst-node-little"colspan="1">IP<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="1">-<td class="inst-node-little"colspan="3">DMode<td class="inst-node-little"colspan="4">Vector<tr><td colspan="4">ERROR<td class="inst-node-little"colspan="11">-<td class="inst-node-little"colspan="1">M<td class="inst-node-little"colspan="3">-<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="4">-<td class="inst-node-little"colspan="4">Vector<tr><td colspan="4">PCINT<td class="inst-node-little"colspan="11">-<td class="inst-node-little"colspan="1">M<td class="inst-node-little"colspan="3">-<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="1">-<td class="inst-node-little"colspan="3">DMode<td class="inst-node-little"colspan="4">Vector</table>
214+
214215 - Vector 为中断向量号,当中断发生时,CPU 会跳转到中断向量表中对应处理程序执行。
215216 - DMode (Delivery Mode )为中断传递模式,本实验中不做理解要求。
216217 - DS (Delivery Status )为中断传递状态,只读。
@@ -240,6 +241,7 @@ impl XApic {
240241- 设置计时器相关寄存器。
241242
242243 APIC 中控制计时器的寄存器包括 TDCR 、TICR 和 LVT Timer 。其中,TDCR 用于设置分频系数,TICR 用于设置初始计数值。
244+
243245 - TDCR (0x3E0 ) 的分频系数决定了总线时钟与计时器时钟的比例,也即计时器的计数频率。
244246 - TICR (0x380 ) 的初始计数值决定了计时器的计数周期,每当计数到 0 时,就会触发中断。
245247
@@ -279,6 +281,7 @@ impl XApic {
279281 <table class="inst"><tr><td class="inst-numnode"colspan="3"><td class="inst-numnodel">63<td class="inst-numnode"colspan="3"><td class="inst-numnoder">56<td class="inst-numnode"colspan="17"><td class="inst-numnoder">32<tr><td colspan="3">0x310<td class="inst-node-little"colspan="5">DF<td class="inst-node-little"colspan="18">-<tr><td class="inst-numnode"colspan="3"><td class="inst-numnodel">31<td class="inst-numnode"colspan="4"><td class="inst-numnoder">20<td class="inst-numnode"colspan="1"><td class="inst-numnoder">18<td class="inst-numnode"colspan="1"><td class="inst-numnoder">16<td class="inst-numnoder">15<td class="inst-numnoder">14<td class="inst-numnoder">13<td class="inst-numnoder">12<td class="inst-numnoder">11<td class="inst-numnode"colspan="2"><td class="inst-numnoder">8<td class="inst-numnode"colspan="4"><td class="inst-numnoder">0<tr><td colspan="3">0x300<td class="inst-node-little"colspan="6">-<td class="inst-node-little"colspan="2">DSH<td class="inst-node-little"colspan="2">-<td class="inst-node-little"colspan="1">TM<td class="inst-node-little"colspan="1">LV<td class="inst-node-little"colspan="1">-<td class="inst-node-little"colspan="1">DS<td class="inst-node-little"colspan="1">DM<td class="inst-node-little"colspan="3">DMode<td class="inst-node-little"colspan="5">Vector</table>
280282
281283 具体的配置配置细节这里不做理解要求,只需要按照如下描述进行配置即可:
284+
282285 - DSH (Destination Shorthand ):设置为 2 ,始终将中断发送给所有 APIC
283286 - DMode (Delivery Mode ):设置为 5 ,INIT De - assert 模式
284287 - LV (Level ):设置为 0 ,INIT De - assert 模式
Original file line number Diff line number Diff line change @@ -437,6 +437,7 @@ pub const STACK_INIT_TOP: u64 = STACK_MAX - 8;
4374372 . 创建内核结构体
438438
439439 调用 ` Process::new ` 函数,创建内核进程,它会返回一个 ` Process ` 的智能指针。
440+
440441 - 在上述的假设中,实验使用 ` 0 ` 表示无进程(正在运行),内核进程的 PID 应为 ` 1 ` 。
441442 - 内核进程没有父进程,可以直接传入 ` None ` 。
442443 - 内核进程的页表就是当前 ` Cr3 ` 寄存器的内容,使用 ` PageTableContext::new() ` 加载。
Original file line number Diff line number Diff line change @@ -953,6 +953,7 @@ The factorial of 999999 under modulo 1000000007 is 128233642.
953953 ** 经过<s >近三个小时的</s >排查,发现他将 TSS 中的 ` privilege_stack_table ` 相关设置注释掉了。**
954954
955955 请查阅资料,了解特权级栈的作用,实验说明这一系列中断的触发过程,尝试解释这个现象。
956+
956957 - 可以使用 ` intdbg ` 参数,或 ` ysos.py -i ` 进行数据捕获。
957958 - 留意 ` 0x0e ` 缺页异常和缺页之前的中断的信息。
958959 - 注意到一个不应当存在的地址……?
Original file line number Diff line number Diff line change @@ -963,6 +963,7 @@ pub fn sys_sem(args: &SyscallArgs, context: &mut ProcessContext) {
963963 RAII(Resource Acquisition Is Initialization)是一种资源获取即初始化的技术,它通过在对象的构造函数中获取资源,然后在析构函数中释放资源的方法,来保证资源的正确释放。
964964
965965 对于 Rust,也即实现 ` MutexGuard ` 类似的结构,它在构造时获取锁,然后在此结构体被移出作用域时释放锁。
966+
966967 - 在 ` acquire ` 时候返回 ` MutexGuard ` 对象。
967968 - 移除 ` release ` 函数,使用 ` MutexGuard ` 的 ` Drop ` trait 来释放锁。
968969
Original file line number Diff line number Diff line change @@ -342,6 +342,7 @@ pub enum Resource {
3423421 . procfs
343343
344344 在 ` /proc ` 中,你可以找到一系列的文件和文件夹,探索他们并回答如下问题:
345+
345346 - 解释 ` /proc ` 下的数字目录代表什么,其内部存在什么内容?
346347 - ` /proc/cpuinfo ` 和 ` /proc/meminfo ` 存储了哪些信息?
347348 - ` /proc/loadavg ` 和 ` /proc/uptime ` 存储了哪些信息?
@@ -353,6 +354,7 @@ pub enum Resource {
3533542 . devfs
354355
355356 Linux 将设备也作为“文件”,默认挂载于 ` /dev ` 目录下,探索他们并回答如下问题:
357+
356358 - ` /dev/null ` 、` /dev/zero ` 、` /dev/random ` 和 ` /dev/urandom ` 分别有什么作用?
357359 - 尝试运行 ` head /dev/kmsg ` 并观察输出,结合搜索引擎,解释这一文件的作用。
358360 - ` /dev/sdX ` 和 ` /dev/sdX1 ` (X 为一个字母,1 为数字)是什么?有什么区别?如果你正在使用的 Linux 系统中不存在这样的文件,请找到功能类似的文件,并解释。
@@ -363,6 +365,7 @@ pub enum Resource {
3633653 . tmpfs
364366
365367 在 Linux 中 ` /dev/shm ` 、` /run ` 或者 ` /var/run ` 目录下,存储了一个特殊的文件系统,它是一个内存文件系统,探索它并回答如下问题:
368+
366369 - 列出这些目录,尝试找到扩展名为 ` pid ` 的文件。应用程序如何利用它们确保** 某个程序只运行一个实例** ?
367370 - 列出这些目录,尝试找到扩展名为 ` lock ` 的文件。应用程序如何利用它们确保** 某个资源只被一个程序访问** ?
368371 - 列出这些目录,尝试找到扩展名为 ` sock ` 或 ` socket ` 的文件。应用程序如何利用它们实现** 进程间通信** ?
You can’t perform that action at this time.
0 commit comments