我读到的关于DPMI和中断的每个资源都说可以锁定(也就是固定)中断处理程序中可能使用的所有内存(代码/数据/堆栈),以确保它不会被分页。这背后的想法是,当中断处理程序中发生页面错误时,您将遇到双重错误,并且您的程序将崩溃。
但是真的如此吗?我想在中断发生时可能会发生双重故障,并且CPU尝试跳转到中断处理程序,但代码恰好被分页。一旦您的ISR代码已经运行,我就不会看到页面错误如何导致灾难。中断上下文和正常程序上下文之间有什么不同?
作为一个快速测试,我写了一个简单的定时器ISR,用char* ptr = new char[1024*1024]
分配一些内存,然后立即丢弃指针。在启用了分页的情况下在CWSDPMI下运行,这会在一段时间后崩溃,但仅仅因为new
引发std::bad_alloc
异常。据我所知,没有双重错误。
也许如果在执行磁盘I / O(在int 21的中间)发生中断,并且页面错误处理程序再次调用int 21,则可能会导致问题。但那与双重故障没有任何关系。然后我不认为在int 21期间可以调用保护模式中断处理程序。
锁定内存真的那么重要吗?