2

我读到的关于 DPMI 和中断的每一个资源都说,可能在中断处理程序中使用的所有内存(代码/数据/堆栈)都应该被锁定(又名固定),以确保它不会被分页。这背后的想法是,当中断处理程序中发生页面错误时,您将得到双重错误,您的程序将崩溃。

但真的是这样吗?我想在中断发生的那一刻可能会发生双重故障,并且 CPU 尝试跳转到您的中断处理程序,但代码恰好被调出。一旦您的 ISR 代码已经在运行,我看不出页面错误会如何导致灾难。中断上下文和正常程序上下文有什么不同?

作为一个快速测试,我编写了一个简单的计时器 ISR,它用 分配一些内存char* ptr = new char[1024*1024],然后立即丢弃指针。在启用分页的 CWSDPMI 下运行,这确实会在一段时间后崩溃,但这只是因为new引发了std::bad_alloc异常。据我所知,没有双重错误。

也许如果在执行磁盘 I/O 时发生中断(在 int 21 的中间),并且页面错误处理程序再次调用 int 21,这可能会导致麻烦。但这与双重错误无关。然后我认为无论如何都不能在 int 21 期间调用保护模式中断处理程序。

锁定内存真的那么重要吗?

4

0 回答 0