Assembly 我的内核在qemu中正常运行,但在bochs中出现双重错误

Assembly 我的内核在qemu中正常运行,但在bochs中出现双重错误,assembly,operating-system,x86,kernel,Assembly,Operating System,X86,Kernel,我的内核在执行第一页错误时崩溃。 我的页面错误处理程序如下所示: asm_page_error_wrapper: PUSHA movl %esp, %esi pushl 48(%esi)/*esp,pusha has already been calculated*/ pushl 32(%esi)/*error*/ CALL page_error_interrupt popl %ecx popl %ecx POPA ad

我的内核在执行第一页错误时崩溃。 我的页面错误处理程序如下所示:

asm_page_error_wrapper:
    PUSHA  
    movl %esp, %esi
    pushl 48(%esi)/*esp,pusha has already been calculated*/
    pushl 32(%esi)/*error*/
    CALL page_error_interrupt
    popl %ecx
    popl %ecx
    POPA
    addl $4, %esp
    IRET
在gdb中,它在“
PUSHL48(%esi)
”崩溃

以下是bochs日志中的内容:


我不知道原因。

从屏幕截图上看,您的
IDT
对于#GP处理程序条目无效。我不确定您是如何得出结论,认为坠机发生在
PUSHL48(%esi)
。这是可能的,但这里似乎不是这样

如果仿真器产生不同的结果,可能有以下几个原因:

  • 代码处理未初始化的数据(在寄存器或内存中)
  • 你的代码中有一个竞争条件
  • 有一个模拟错误

  • 在内核配置中,是否启用了任何准虚拟设备驱动程序?这些特定于特定的虚拟机监控程序。您是指bochs配置还是我的内核中断安装程序?您自己编译了这个内核二进制文件,对吗?构建过程严重依赖于
    .config
    文件,该文件通常是在
    make oldconfig
    make menuconfig
    make xconfig
    的帮助下创建的。内核很小,由我编写,它在qemu中正常运行,但在bochs下崩溃。如果这是您自己编写的内核,你真的应该在问题中说清楚。因为当您使用
    linux
    kernel
    标记时,人们会认为您在使用linux内核时遇到了问题。“我的内核”可以简单地表示“我的计算机上的内核”。gdb显示在“推送48(%esi)”时发生中断。这就是我的结论。