c - 如何在 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”,可回收/分配用于任何其他目的)。
推荐阅读
- java - 如何在矩形区域上插入可点击的透明字段?
- kotlin - 我尝试使用 Kotlin Coroutine Channels 并收到 ObsoleteCoroutinesApi 警告。替代品在哪里?
- svn - Subversion 可以在同一个文件夹中创建外部文件吗?
- geolocation - 一旦用户停止移动一段合理的时间,确定 GPS 跟踪用户位置的最佳策略是什么?
- c - 无重复排列 C
- python - 接受一个列表并返回两个列表的递归函数
- vue.js - 是否可以使用 vue-chartjs 打印图表?
- c# - c#从不同类的方法中填充dataGridView1?
- java - 为什么此 Vaadin 11.0.0 应用程序中未显示网格?
- sql - 具有嵌套外键的行上的 DELETE 请求