如何在 asm 中重置 IVT?无需重新启动计算机

问题描述

我正在用 c 和 asm 创建一个操作系统,我的 IVT 有问题,我认为它已损坏。所以我想在不重新启动计算机的情况下重新初始化 IVT 我真的不知道是否可能,因为我在谷歌上什么也没找到。 谢谢你的回答

解决方法

对于过时的 BIOS,没有某种重置是无法做到的(这可能是“热重置”而不是“冷重置”,后者速度更快,但仍会阻止您的代码继续运行)。

对于替代品;你可以:

a) 自己创建旧 IVT 的副本(例如,在启动早期,当您知道它仍然良好时)并从副本中恢复它。这也可以用于检测 IVT 是否/何时/在哪里损坏(例如,将 IVT 与代码中不同位置的副本进行比较,以便您可以找出类似“在我调用 foo() 之前它很好但是foo() 返回后损坏,损坏位于地址 0x00123"。

b) 计算 IVT 的校验和,并使用它来确定 IVT 是否/何时被修改(无法恢复 IVT)。

c) 如果您知道 IVT 的特定部分已损坏;设置 CPU 的调试寄存器以在修改 IVT 的那部分时生成陷阱异常。这更复杂(您必须挂钩/替换“中断 0x01”的中断处理程序)。

d) 使用带有调试器(Bochs、Qemu、VirtualBox)的模拟器,它允许您单步执行和检查内存,和/或设置断点(包括“在地址...处的数据被修改时中断”),以确定 IVT 是否/何时被损坏。

e) 使用“桌面检查”查找问题(阅读和分析源代码以查找可以解释症状的错误)。这可能是最好的方法,因为您也可能会发现其他错误;并且因为无论如何都不应该有太多代码需要检查(通常在操作系统控制硬件之前执行的引导加载程序中只有几 KiB,重新配置硬件以使 BIOS 无论如何都无法工作,然后开始处理内存包含 IVT 作为“空闲 RAM”,可回收/分配用于任何其他目的)。