Linux 或其他 OS 如何测试他们的 OS 以确认两个进程上下文切换正确?

How Linux or other OS test their OS to confirm that two processes context switch correctly?

我正在学习和编写操作系统。现在我已经了解了如何切换两个进程以使我的 OS 支持多进程。

当我第一次编写此功能时,运行ning 在我的 OS 上的两个进程首先 运行ning 正确,但比它们 运行 奇怪...

我知道这是因为两个进程的EIP或者其他一些寄存器保存不正确...

我发现很难测试上下文切换,因为我不知道时钟中断何时到来,两个进程去哪里...

所以我想知道 Linux、Windows 或其他操作系统如何测试它们的进程上下文切换?

用汇编语言写几个测试。第一个应该在无限循环中 运行 ,应该将其所有寄存器设置为已知值,然后测试寄存器是否具有这些值。例如:

top:
    cmp rax_v(%rip), %rax
    jne rax_error
    cmp rbx_v(%rip), %rbx
    jne rbx_error
    ....
    jmp top

运行将其设置为低优先级应该可以很好地覆盖中断处理程序和中断 -> 上下文切换正确保存和恢复寄存器。请记住在寄存器中使用各种不同的值以最大程度地减少错误匹配。

按照这个模式,制作一个调用系统调用的。当然它不能检查所有寄存器,因为系统调用可以自由使用 ABI,但它可以检查其他寄存器。另外,如果你想让你的系统保证寄存器泄漏,你可以在这里检查。

运行 一组进程,也许其中一些也是线程。

接下来,您需要增加中断负载,目标是达到最大可能的中断嵌套。如果你有真正的串行端口,它们可以成为它们的重要来源——将噪声源(函数发生器或天线)连接到 uart 的载波检测引脚,并启用调制解调器状态中断。大多数 uart 不会在波特时钟上门控这些状态引脚,因此您可以从中获得最大的中断风暴。尝试将 uart 设置为最低的中断优先级。

祝你好运,你应该有很多乐趣!