Машина вылетает при попытке выключить в сборке и C - PullRequest
0 голосов
/ 28 мая 2020

Я создал файл сборки, который выключает компьютер, вместе с некоторым кодом C. Когда я пытаюсь установить связь с ld. Это сработало Кроме того, вот код, который делает это:

# set flags to 0
.set FLAGS,    0

# set magic number to 0x1BADB002 to identified by bootloader 
.set MAGIC,    0x1BADB002

# set the checksum
.set CHECKSUM, -(MAGIC + FLAGS)

# set multiboot enabled
.section .multiboot

# define type to long for each data defined as above
.long MAGIC
.long FLAGS
.long CHECKSUM


# set the stack bottom 
stackBottom:

# define the maximum size of stack to 512 bytes
.skip 4096


# set the stack top which grows from higher to lower
stackTop:

.section .text
.global _start
.type _start, @function

shutdown:
  mov %ax, 0x1000
  mov %ax, %ss
  mov %sp, 0xf000
  mov %ax, 0x5307
  mov %bx, 0x0001
  mov %cx, 0x0003
  int $0x15

  ret

_start:

  # assign current stack pointer location to stackTop
    mov $stackTop, %esp

  # call the kernel main function
    call kernel_entry
    call shutdown

    cli


# put system in infinite loop
hltLoop:

    hlt
    jmp hltLoop

.size _start, . - _start





Когда я пробую его в Virtualbox, он говорит следующее: Running it in Virtualbox
В QEMU машина вылетает и перезагружается .
Есть ли способ корректно выключить ОС без ошибок? Любая помощь приветствуется.

1 Ответ

0 голосов
/ 07 июня 2020

Я нашел способ сделать это c способами, специфичными для эмулятора. Спасибо, Джестер, за помощь!

...