1

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

  1. 禁用所有中断
  2. 重启

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

这是软盘图像:

$高清软盘.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 二进制 -D floppy.img -m i386

floppy.img:文件格式二进制


.data 部分的反汇编:

00000000 :
       0:fa cli    
       1:f4 hlt    
    ...
     1fe: 55 推送 %ebp
     1ff: aa stos %al,%es:(%edi)

Bochs 输出(pastebin)。

bochsrc.txt:

romimage:文件=/usr/share/bochs/BIOS-bochs-latest,地址=0xe0000
vgaromimage: 文件=/usr/share/bochs/VGABIOS-lgpl-latest
软盘:1_44=软盘.img,状态=插入
引导:一个
日志:OSDev.log
鼠标:启用=0
兆:32
显示库:sdl

我以这种方式运行 bochs:

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

$ bochs -f bochsrc.txt

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

我究竟做错了什么?

4

2 回答 2

2

hlt不重启;那不是它的用途。它会暂停处理器,直到中断到达,并且由于您已禁用中断,因此它将永远坐在那里无所事事。

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

于 2013-09-01T18:36:54.700 回答
1

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

.loop:
    cli
    hlt
    jmp .loop

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

我建议尝试使用另一个虚拟机,例如 QEMU。

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

    jmp $ffff:$0000

对于热重启:

    mov  [$472], 1234h
    jmp  $ffff:$0000
于 2013-09-02T06:30:47.540 回答