Assembly 双字节操作系统不是我想要的

Assembly 双字节操作系统不是我想要的,assembly,bochs,x86-16,Assembly,Bochs,X86 16,我从创建了软盘启动映像,它应该: 禁用所有中断 重新启动 然而,一旦我用bochs启动它,它会消耗100%的CPU,直到我杀死它 $ bochs -f bochsrc.txt 这是软盘映像: $ hd floppy.img 00000000 fa f4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

我从创建了软盘启动映像,它应该:

  • 禁用所有中断
  • 重新启动
  • 然而,一旦我用bochs启动它,它会消耗100%的CPU,直到我杀死它

    $ bochs -f bochsrc.txt
    
    这是软盘映像:

    $ hd floppy.img 00000000 fa f4 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 000001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa |..............U.| 00000200 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| * 00168000 Bochs版本:2.4.6-4,在ubuntu 12.04 i686上运行


    我做错了什么?

    hlt
    不会重新启动;这不是它的目的。它会暂停处理器直到中断到来,并且由于您已经禁用了中断,它将永远坐在那里什么也不做

    至于为什么仿真器消耗100%的CPU,这可能是由于仿真器的实现方式。在(某些版本的)Linux上,
    hlt
    用于使处理器空闲到下一个时间片,因此它当然不会使处理器忙碌等待。:-)

    CLI不会禁用NMI(不可屏蔽中断),因此以下代码更好:

    .loop:
        cli
        hlt
        jmp .loop
    
    不清楚为什么Bochs会提供100%的CPU负载。你是如何检查这批货物的?通过真实的CPU负载,或者Bochs有自己的虚拟CPU负载指示器

    我建议尝试另一个虚拟机,比如QEMU

    因此,上面的代码将引导然后休眠。如果打算重新启动计算机,以下代码应执行冷重启

        jmp $ffff:$0000
    
    对于热重启:

        mov  [$472], 1234h
        jmp  $ffff:$0000
    

    重新启动后它将做什么?重新启动?
    hlt
    不会重新启动。这不是它的目的。它会暂停处理器直到中断到来,既然您已经禁用了中断…@ChrisJester-Young,那么为什么仿真器要消耗100%的CPU?@JanDvorak可能是因为仿真器就是这样实现的。我认为,如果你在一个真正的CPU上做这件事,它应该不会忙循环;我知道(某些版本的)Linux使用
    hlt
    使处理器空闲。@ChrisJester-Young我仍然认为这是一个主题。是你投的票吗?除了这段代码也不能做OP想要做的事情。
        jmp $ffff:$0000
    
        mov  [$472], 1234h
        jmp  $ffff:$0000