# 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()` 返回。 ---