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

How to reset IVT in asm ? without relaunch the computer

我正在用 c 和 asm 创建操作系统,我的 IVT 有问题我认为它已损坏。所以我想在不重新启动计算机的情况下重新初始化 IVT 我真的不知道这是否可能,因为我在 google 上找不到任何东西。 感谢您的回答

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

备选方案;你可以:

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

b) 计算 IVT 的校验和并使用它来确定 if/when IVT 已被修改(无法恢复 IVT)。

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

d) 使用带有调试器(Bochs、Qemu、VirtualBox)的模拟器,允许您单步执行和检查内存,and/or 设置断点(包括“当数据位于地址时中断......被修改"), 找出 if/when IVT 被破坏。

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