Files
xv6-labs/alarmtest_tests.md
2025-06-23 19:08:25 +08:00

2.0 KiB

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