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

时间:2013-09-01 17:34:12

标签: assembly bochs x86-16

我从example创建了一个软盘引导映像,它应该:

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

    这是软盘图片:

    $ 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
    

    反汇编图片:

    $ objdump -b binary -D floppy.img -m i386
    
    floppy.img:     file format binary
    
    
    Disassembly of section .data:
    
    00000000 :
           0:   fa                      cli    
           1:   f4                      hlt    
        ...
         1fe:   55                      push   %ebp
         1ff:   aa                      stos   %al,%es:(%edi)
    

    Bochs output(pastebin)。

    bochsrc.txt:

    romimage:    file=/usr/share/bochs/BIOS-bochs-latest, address=0xe0000
    vgaromimage: file=/usr/share/bochs/VGABIOS-lgpl-latest 
    floppya: 1_44=floppy.img, status=inserted 
    boot: a
    log: OSDev.log
    mouse: enabled=0
    megs: 32
    display_library: sdl
    

    我用这种方式运行bochs:

    然而,一旦我用bochs启动它,它会消耗100%的CPU直到我杀死它。

    $ bochs -f bochsrc.txt
    

    Bochs版本:2.4.6-4,在ubuntu 12.04 i686上运行。

    我做错了什么?

2 个答案:

答案 0 :(得分:2)

hlt不会重启;这不是它的用途。它会暂停处理器直到中断到来,并且由于你已经禁用了中断,它只会在那里无所事事。

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

答案 1 :(得分:1)

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

.loop:
    cli
    hlt
    jmp .loop

目前尚不清楚为什么Bochs会提供100%的CPU负载。你是如何检查这个负载的?通过真正的CPU负载,还是Bochs拥有自己的虚拟CPU负载指示器?

我建议尝试使用其他虚拟机,例如QEMU。

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

    jmp $ffff:$0000

热重启:

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