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



我从一个例子中创建了一个软盘引导映像,它应该是:

  1. 禁用所有查询
  2. 重新启动

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

这是软盘图像:

$hd floppy.img00000000 fa f4 00 00 00 00 000 00 00 00 0000 00 00 ||00000010 00 00 00 00 0 00 00 00 000 00 00 00 0000 00 00 ||*000001f0 00 00 00 00 000 00 00 00 0000 00 00 55 aa |。。。。。。。。。。。。。。U|00000200 00 00 00 00 000 00 00 00 0000 00 00 ||*00168000

分解图像:

$objdump-b二进制-D floppy.img-m i386floppy.img:文件格式二进制截面数据的拆卸:00000000:0:fa cli1:f4 hlt。。。1fe:55推%ebp1ff:aa stos%al,%es:(%edi)

Bochs输出(pastebin)。

bochsrc.txt:

romimage:file=/usr/share/bochs/BIOS-bochs最新,地址=0xe000vgaromimage:file=/usr/share/bochs/VGABIOS lgpl最新floppya:1_44=floppy.img,状态=已插入引导:a日志:OSDev.log鼠标:已启用=0兆欧:32display_library:sdl

我用这种方式运行bochs:

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

$ bochs -f bochsrc.txt

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

相关内容

  • 没有找到相关文章