diff --git a/.gitignore b/.gitignore index cc22819..f42980f 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,5 @@ ph barrier /lab-*.json .DS_Store +compile_commands.json + diff --git a/alarmtest_tests.md b/alarmtest_tests.md new file mode 100644 index 0000000..eebc1e5 --- /dev/null +++ b/alarmtest_tests.md @@ -0,0 +1,91 @@ +# alarmtest.c 测试 + +## test0: 单次调用测试 + +**函数**: `test0()` + +**目的**: 测试内核是否至少调用了一次 alarm 处理程序。 + +**描述**: + +- 设置 alarm 每 2 个时钟周期触发一次。 + +- 在一个长循环中检查 `count` 是否被处理程序修改。 + +- 如果 `count > 0`,测试通过;否则失败。 + +--- + +## test1: 多次调用与寄存器恢复测试 + +**函数**: `test1()` + +**目的**: 测试内核是否多次调用 alarm 处理程序,并确保处理程序返回后程序继续从中断点执行,且寄存器值未被破坏。 + +**描述**: + +- 设置 alarm 每 2 个时钟周期触发一次。 + +- 在循环中调用 `foo()` 函数,同时检查 `count` 是否达到 10。 + +- 验证 `foo()` 的调用次数是否与循环计数一致。 + +- 如果 `count < 10` 或寄存器值不一致,测试失败;否则通过。 + +--- + +## test2: 防止重入调用 + +**函数**: `test2()` + +**目的**: 测试内核是否防止 alarm 处理程序的重入调用。 + +**描述**: + +- 设置 alarm 每 2 个时钟周期触发一次,处理程序为 `slow_handler()`。 + +- 在子进程中运行一个长循环,检查 `count` 是否被修改。 + +- 如果 `count > 1`,测试失败;否则通过。 + +--- + +## test3: 寄存器 a0 的完整性测试 + +**函数**: `test3()` + +**目的**: 测试从 `sys_sigreturn()` 返回时,寄存器 `a0` 的值是否被修改。 + +**描述**: + +- 设置 alarm 每 1 个时钟周期触发一次,处理程序为 `dummy_handler()`。 + +- 在触发 alarm 后检查寄存器 `a0` 的值是否保持为初始值 `0xac`。 + +- 如果 `a0` 被修改,测试失败;否则通过。 + +--- + +## 处理程序说明 + +### `periodic()` + +- 增加 `count` 值并打印 "alarm!"。 + +- 调用 `sigreturn()` 返回。 + +### `slow_handler()` + +- 增加 `count` 值并打印 "alarm!"。 + +- 如果 `count > 1`,测试失败并退出。 + +- 运行一个长循环以模拟慢速处理程序。 + +- 调用 `sigreturn()` 返回。 + +### `dummy_handler()` + +- 立即卸载自身并调用 `sigreturn()` 返回。 + +---