X86 是否真的有必要锁定中断处理程序中可能涉及的所有内存?

X86 是否真的有必要锁定中断处理程序中可能涉及的所有内存?,x86,dos,bare-metal,djgpp,X86,Dos,Bare Metal,Djgpp,我读到的关于DPMI和中断的每一个资源都说,中断处理程序中可能使用的所有内存(代码/数据/堆栈)都应该被锁定(也称为pinted),以确保它不会被调出。这背后的想法是,当一个页面错误发生在中断处理程序中时,您将得到一个双重错误,并且您的程序将崩溃 但真的是这样吗?我想,当中断发生时,可能会发生双重错误,CPU试图跳转到中断处理程序,但代码恰好被调出。一旦您的ISR代码已经运行,我就看不出页面错误会导致灾难。中断上下文和正常程序上下文之间有什么不同 作为快速测试,我编写了一个简单的计时器ISR,它

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

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

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

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


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

我绝对不是这方面的专家,但有可能调出一个中断处理程序吗?IDT不包含物理地址吗?而且<代码>新建?在ISR中?我相信IDTR确实指向IDT的物理位置,但IDT本身存储虚拟地址。是的,如果你有一个在汇编中写的包装函数(DJGPP在它的标准库中提供一个),你可以用C++编写ISRs。但是为什么在中断中添加新代码?您希望让它尽快返回,并将其委托给高级处理程序。你不会想让它进入页面,分配,含糊不清,免费。。。至少,我不会…我只是在分配内存,试图触发一个页面错误。。。但是没有什么灾难性的事情发生,这让我想知道中断上下文中的页面错误到底是不是一个大问题。没有人知道在现实生活中如何做到这一点。