我从example创建了一个软盘引导映像,它应该:
然而,一旦我用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上运行。
我做错了什么?
答案 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