двухбайтная операционная система не то, что я хочу

Я создал загрузочный образ дискеты из примера, он должен:

  1. отключить все прерывания
  2. перезагружать

Однако, как только я запускаю его с бохами, он потребляет 100% процессора, пока я его не убью.

Вот образ дискеты:

$ 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 (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

Я запускаю бох таким образом:

Однако, как только я запускаю его с бохами, он потребляет 100% процессора, пока я его не убью.

$ bochs -f bochsrc.txt

Версия Bochs: 2.4.6-4, работающая на Ubuntu 12.04 i686.

Что я делаю неправильно?


person Motiejus Jakštys    schedule 01.09.2013    source источник
comment
Что он будет делать после перезагрузки? Перезагрузить снова?   -  person John Dvorak    schedule 01.09.2013
comment
hlt не перезагружается. Это не то, для чего это нужно. Он приостанавливает работу процессора до тех пор, пока не поступит прерывание, а поскольку вы отключили прерывания...   -  person Chris Jester-Young    schedule 01.09.2013
comment
@ChrisJester-Young, тогда почему эмулятор потребляет 100% ресурсов ЦП?   -  person John Dvorak    schedule 01.09.2013
comment
@JanDvorak Предположительно, потому что так реализован эмулятор. Я думаю, что если вы сделаете это на реальном процессоре, он не должен зацикливаться; Я знаю, что (некоторые версии) Linux используют hlt для бездействия процессора.   -  person Chris Jester-Young    schedule 01.09.2013
comment
@ChrisJester-Young Я все еще думаю, что это по теме. Это вы проголосовали?   -  person John Dvorak    schedule 01.09.2013
comment
@ChrisJester-Янг действительно. Все в порядке, я просто невнимательно прочитал туториал: он не должен перезагружаться. Если бы вы сделали ответ вместо комментария, я мог бы отметить его правильно   -  person Motiejus Jakštys    schedule 01.09.2013
comment
@JanDvorak Нет, я не голосовал за закрытие вопроса.   -  person Chris Jester-Young    schedule 01.09.2013
comment
@MotiejusJakštys Хорошо, я опубликовал ответ, который резюмирует эту тему. :-)   -  person Chris Jester-Young    schedule 01.09.2013


Ответы (2)


hlt не перезагружается; это не то, для чего это нужно. Он приостанавливает работу процессора до тех пор, пока не поступит прерывание, и, поскольку вы отключили прерывания, он будет просто сидеть и ничего не делать вечно.

Что касается того, почему эмулятор потребляет 100% ресурсов ЦП, это, вероятно, связано с тем, как реализован эмулятор. В (некоторых версиях) Linux hlt используется для бездействия процессора до следующего временного интервала, поэтому, конечно, это не заставляет процессор ждать. :-)

person Chris Jester-Young    schedule 01.09.2013

CLI не отключит NMI (не маскируемые прерывания), поэтому следующий код все же лучше:

.loop:
    cli
    hlt
    jmp .loop

Непонятно, почему Бохс дает 100% загрузку процессора. Как вы проверяете эту нагрузку? По реальной загрузке ЦП, или у Боха есть свой индикатор загрузки виртуального ЦП?

Я бы предложил попробовать другую виртуальную машину, например QEMU.

Таким образом, приведенный выше код загрузится, а затем заснет. Если предполагается перезагрузить компьютер, следующий код должен выполнять холодный перезапуск.

    jmp $ffff:$0000

Для теплого перезапуска:

    mov  [$472], 1234h
    jmp  $ffff:$0000
person johnfound    schedule 02.09.2013
comment
За исключением того, что этот код также не делает то, что пытается сделать OP. - person Brian Knoblauch; 02.09.2013