【发布时间】:2020-06-26 11:17:40
【问题描述】:
当我的页面错误处理程序中断被调用(它应该挂起系统)时,在调用它之前有一些变量被推入堆栈。我启用了虚拟内存,当我设置一个无效的堆栈指针 (esp) 并且 int14 处理程序被调用时,它会立即导致另一个页面错误等等。我应该如何解决这种情况?
我的 int14 代码:
isr14:
; interrupt handler for isr14
jmp $
iretd
导致它崩溃的代码:
mov esp, 0x1000 ; 0x1000 is not mapped in the VM directory
push dword 'A'
jmp $
我的 IDT 表部分:
irq14:
dw isr14
dw 0x0008
db 0x00
db 10101110b
dw 0x0000
irq15:
........
【问题讨论】:
-
我对此不是很熟悉,但我记得解决方案是有一个单独的安全堆栈,在处理页面错误时中断描述符切换到。
-
我明白了,但是在调用中断之前我应该如何切换到该堆栈?
-
我对细节有点模糊,但我记得你可以在中断描述符的某个地方对其进行编码。让我检查一下文档。
-
在 TSS 中定义要切换到的堆栈。然后设置一个带有非零字段的中断门,该字段引用保存在 TSS 中的堆栈段/指针。这应该可以解决问题。
-
@fuz:我似乎记得 Michael Petch 曾对此发表过回答。也许只是因为 TSS 是允许内核处理内核堆栈上的中断的机制,而不是让用户空间崩溃或拥有机器。例如Creating a proper Task State Segment (TSS) structure with and without an IO Bitmap?/During an x86 software interrupt, when exactly is a context switch made?。 wiki.osdev.org/Getting_to_Ring_3 看起来很相关。
标签: assembly x86 kernel virtual-machine interrupt