Skip to content

Commit 68df9c9

Browse files
authored
chore(docs): 增加思考题,修复文档错误 (#57)
1 parent 6e21eab commit 68df9c9

9 files changed

Lines changed: 87 additions & 11 deletions

File tree

docs/labs/0x00/tasks.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
- Ubuntu 24.04 LTS (Noble) on WSL 2 **(推荐 Windows 用户选择)**
1818
- Windows 10/11 **(Windows 原生备选,GDB 相关功能无法使用)**
1919
- Ubuntu 24.04 LTS (Noble)
20+
- **麒麟 Linux Advanced Server V11(Kylin OS)**(x86-64 或 aarch64)
2021
- macOS with Apple Silicon
2122

2223
以上环境经过我们的测试和验证,可以正常进行实验。对于其他常用的 Linux 发行版,通常也可以正常进行实验,但我们不提供技术支持。
@@ -381,6 +382,16 @@ BdsDxe: starting Boot0002 "UEFI QEMU HARDDISK QM00001 " from ...
381382

382383
4. 为什么我们需要使用 `#[entry]` 而不是直接使用 `main` 函数作为程序的入口?
383384

385+
??? question "可选思考题(提高)"
386+
387+
1. 结合本实验代码:
388+
- 为什么忙等待(`nop` 循环)会影响系统可观测性与能耗?
389+
- 若改为基于 UEFI 定时事件的等待,你预期日志输出的时间稳定性会有什么变化?
390+
391+
2. 在 `no_std` 环境下,为什么“可观测性(日志/断言/错误路径)”往往比业务逻辑更难补齐?
392+
393+
3. 如果把本实验的 UEFI 程序迁移到另一台固件实现不同的机器上,你认为最先出现兼容性问题的环节会是什么?为什么?
394+
384395
## 加分项
385396

386397
!!! tip "本次实验的加分项均为 **在现有操作系统 std 环境下的 Rust 独立二进制**"

docs/labs/0x01/tasks.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -524,6 +524,17 @@ println!("{}", record.args());
524524

525525
**这一步骤不做要求,如果自身环境实现遇到困难,可以尝试与其他同学合作进行观察。**
526526

527+
528+
??? question "可选思考题(提高)"
529+
530+
1. 结合本实验中 ELF 映射、页表与串口初始化的实现,讨论:
531+
- 你会如何划分“最小可启动路径”和“可调试增强路径”?
532+
- 若只能保留 3 个关键日志点,你会放在哪些阶段,为什么?
533+
534+
2. 若内核映射时误把某段权限设置为可写+可执行,你预期这会对系统安全性和调试复杂度带来什么影响?
535+
536+
3. 假设引导阶段必须在“更快启动”和“更多一致性检查”之间二选一,你会如何取舍并给出依据?
537+
527538
## 加分项
528539

529540
1. 😋 线控寄存器的每一比特都有特定的含义,尝试使用 `bitflags` 宏来定义这些标志位,并在 `uart16550` 驱动中使用它们。

docs/labs/0x02/tasks.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,16 @@ pub fn kernel_main(boot_info: &'static boot::BootInfo) -> ! {
526526

527527
7. 在未使用 `set_stack_index` 函数时,中断处理程序的栈可能哪里?尝试结合 gdb 调试器,找到中断处理程序的栈,并验证你的猜想是否正确。
528528

529+
??? question "可选思考题(提高)"
530+
531+
1. 结合本实验的 APIC 初始化与中断路径,分析:
532+
- 哪些初始化步骤必须严格按顺序执行?
533+
- 如果你故意交换其中两步,最可能出现的首个可观测故障是什么?
534+
535+
2. 在“高频中断 + 串口输入 + 调度切换”同时发生时,哪类竞态最容易被忽视?你会如何设计最小复现实验来捕获它?
536+
537+
3. 如果只允许保留一个中断调试手段(日志、寄存器转储、QEMU 调试输出三选一),你会选哪个?请说明理由。
538+
529539
## 加分项
530540

531541
1. 😋 为**全部可能的 CPU 异常**设置对应的处理程序,使用 `panic!` 输出异常信息。

docs/labs/0x03/tasks.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,3 +648,17 @@ pub extern "x86-interrupt" fn page_fault_handler(
648648
2.`src/proc/process.rs` 中,有两次实现 `Deref` 和一次实现 `DerefMut` 的代码,它们分别是为了什么?使用这种方式提供了什么便利?
649649

650650
3. 中断的处理过程默认是不切换栈的,即在中断发生前的栈上继续处理中断过程,为什么在处理**缺页异常和时钟中断**时需要切换栈?如果不为它们切换栈会分别带来哪些问题?请假设具体的场景、或通过实际尝试进行回答。
651+
652+
653+
??? question "可选思考题(提高)"
654+
655+
1. 结合本实验中的线程调度,比较以下两种策略:
656+
657+
- 仅在时钟中断时触发调度;
658+
- 在时钟中断 + 阻塞唤醒点共同触发调度。
659+
660+
讨论它们对响应延迟、公平性和实现复杂度的影响。
661+
662+
2. 若调度器改为“优先级 + 时间片”混合策略,你认为当前数据结构最先需要改动的部分是什么?
663+
664+
3. 缺页处理若与进程退出并发发生,可能出现哪些一致性问题?你会如何加以约束?

docs/labs/0x04/tasks.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,16 @@ The factorial of 999999 under modulo 1000000007 is 128233642.
959959

960960
或许你可以重新复习一下 Lab 2 的相关内容:[double-fault-exceptions](https://os.phil-opp.com/double-fault-exceptions/)
961961

962+
??? question "可选思考题(提高)"
963+
964+
1. 结合本实验中 syscall 相关,思考并回答:
965+
- 在参数校验上,哪些检查应该放在“系统调用分发层”,哪些应放在“具体服务函数层”?
966+
- 若某个 syscall 需要访问用户缓冲区,你会如何设计最小化的防护策略来避免内核崩溃?
967+
968+
2. 如果未来要支持“同一 syscall 的阻塞/非阻塞双语义”,你会把语义选择放在 `fd` 状态、syscall 参数,还是调度器策略中?
969+
970+
3. 在 syscall 失败路径中,返回错误码与直接终止进程各自适用于哪些场景?请结合一个示例说明。
971+
962972
## 加分项
963973

964974
1. 😋 尝试在 `ProcessData` 中记录代码段的占用情况,并统计当前进程所占用的页面数量,并在打印进程信息时,将进程的内存占用打印出来。

docs/labs/0x05/tasks.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -938,6 +938,16 @@ pub fn sys_sem(args: &SyscallArgs, context: &mut ProcessContext) {
938938

939939
6. `core::hint::spin_loop` 使用的 `pause` 指令和 Lab 4 中的 `x86_64::instructions::hlt` 指令有什么区别?这里为什么不能使用 `hlt` 指令?
940940

941+
??? question "可选思考题(提高)"
942+
943+
1. 结合本实验信号量与自旋锁实现,讨论:
944+
- `wait`/`signal` 的语义是否满足“不会丢失唤醒”?
945+
- 若调度时机不当,哪些竞态会导致假阻塞或假唤醒?请给出一个可能时序。
946+
947+
2. 如果将自旋锁替换为“可睡眠锁”,在内核态和用户态分别会带来哪些收益与风险?
948+
949+
3. 对比“信号量 + 等待队列”与“条件变量 + 互斥锁”两种模型,在本实验框架下哪种更易落地?
950+
941951
## 加分项
942952

943953
1. 🤔 尝试实现如下用户程序任务,完成用户程序 `fish`

docs/labs/0x06/tasks.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,16 @@ pub enum Resource {
403403
404404
6. 日志文件系统(如 NTFS)与传统的非日志文件系统(如 FAT)在设计和实现上有哪些不同?在系统异常崩溃后,它的恢复机制、恢复速度有什么区别?
405405
406+
??? question "可选思考题(提高)"
407+
408+
1. 结合本实验中的分区解析、目录项解析、FAT 遍历,回答:
409+
- 你会如何在“驱动层 / 分区层 / 文件系统层”之间划分错误类型与错误边界?
410+
- 哪一层最适合做“容错兜底”,为什么?
411+
412+
2. 若后续要在 FAT16 上增加写入支持,你认为最先需要保证的“一致性不变量”有哪些?请列出至少 3 条。
413+
414+
3. 对比“立即写回”与“延迟写回 + 崩溃恢复”两种策略,在教学实验中你会优先引入哪一种?为什么?
415+
406416
## 加分项
407417
408418
1. 😋 你的操作系统拥有了直接读取文件系统的能力,不妨将加载用户态应用的工作从 bootloader 手中接过:

docs/labs/0x07/tasks.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -905,6 +905,16 @@ assert!(ret == heap_end, "Failed to allocate heap");
905905

906906
- 综合考虑有关内存、文件、I/O 等方面的知识,讨论为什么 `mmap` 系统调用在现代操作系统中越来越受欢迎,它具有哪些优势?
907907

908+
??? question "可选思考题(提高)"
909+
910+
1. 结合本实验中的 `brk`、堆扩展、页回收,讨论:
911+
- 你会优先选择“按需增长”还是“预留增长”策略?
912+
- 在碎片率、系统调用开销、失败回滚复杂度三者之间如何权衡?
913+
914+
2. 若要支持“按页回收 + 延迟合并”的策略,你会把策略逻辑放在分配器内部还是 VM 层?为什么?
915+
916+
3. 当内存紧张时,`fork`、`brk`、`mmap` 三者应如何设定优先级?请给出一个可执行的裁决规则。
917+
908918
## 加分项
909919

910920
1. 😋 尝试借助 `brk` 为用户态堆实现自动扩容:

docs/wiki/linux.md

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ Linux 是一个开源的类 Unix 操作系统内核,它是一个典型的多
77
本次操作系统实验的最终目标也是实现一个能够和用户进行命令行交互的操作系统,因此建议你多尝试使用命令行来完成实验。
88

99
环境的准备工作主要包括:
10+
1011
- 安装 Linux 系统
1112
- 需要安装和配置开发环境 (工具链)
1213
- Make: 构建脚本
@@ -192,17 +193,6 @@ wsl --install -d Ubuntu
192193

193194
在安装完成之后,你应该能正常使用 `make``python` 命令,并用它们来运行项目的编译、运行脚本。
194195

195-
```bash
196-
cd src/0x00
197-
python3 ysos.py build # 或 make build
198-
```
199-
200-
!!! success "预期成功输出"
201-
202-
如果能够看到 `cargo build` 的编译输出,并在 `esp/` 目录下生成 `.efi` 文件,说明环境配置成功。
203-
204-
更完整地验证能否编译、运行、调试内核将在[实验一:操作系统的启动](../labs/0x01/tasks.md)中展开。
205-
206196
## 参考资料
207197

208198
你可以通过下面的一些链接来对命令行的使用进行学习,也可以把它们作为参考文档随用随取:

0 commit comments

Comments
 (0)