首页 > 解决方案 > 如何在 asm 中重置 IVT?无需重新启动计算机

问题描述

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

标签: cassemblyoperating-systeminterruptlow-level

解决方案


对于过时的 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”,可回收/分配用于任何其他目的)。


推荐阅读