2013-09-01 43 views
1

我從example創建軟盤引導映像,它應該:兩個字節的操作系統沒有我想要的

  1. 禁用所有interrups
  2. 重啓

但是,一旦我開始它與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(引擎收錄)。

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

會是什麼重新啓動後怎麼辦?重新啓動? –

+3

'hlt'不重新啓動。這不是它的目的。它暫停處理器,直到中斷到達,因爲你已經禁止中斷...... –

+0

@ ChrisJester-Young那麼爲什麼模擬器消耗100%的CPU? –

回答

2

hlt不重新啓動;這不是它的目的。它暫停處理器,直到中斷到達,並且由於您禁用了中斷,它將永遠坐在那裏無所事事。

至於爲什麼仿真器消耗100%的CPU,這可能是由於仿真器的實現方式。在(某些版本的)Linux上,hlt用於使處理器空閒,直到下一個時間片,所以當然不會使處理器忙碌等待。 :-)

1

CLI不會禁用NMI(非屏蔽中斷),因此,下面的代碼仍然是更好的:

.loop: 
    cli 
    hlt 
    jmp .loop 

爲什麼Bochs的給出100%的CPU負載目前尚不清楚。你如何檢查這個負載?通過真正的CPU負載,或者Bochs有它自己的虛擬CPU負載指示器?

我會建議嘗試與另一個虛擬機,如QEMU。

因此,上面的代碼將啓動,然後睡覺。如果目的是重新啓動計算機,下面的代碼應該做的冷啓動

jmp $ffff:$0000 

對於熱啓動:

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

除了這段代碼也不會做OP所要做的事情。 –

+0

答案已編輯,現在可以。 – johnfound

相關問題