Сборка qemu-system-i386: Попытка выполнить код вне ОЗУ - PullRequest
0 голосов
/ 11 октября 2018

Я получил эту ошибку во время игры с qemu, "qemu-system-i386: Trying to execute code outside RAM".

И на gdb я получил это, так что он остается на movl и когда я выполняю stepi , все сбои:

=> 0xf010002c <relocated>:      add    %al,(%eax)
relocated () at kern/entry.S:74
74              movl    $0x0,%ebp                       # nuke frame pointer
(gdb) stepi
Remote connection closed

Это произошло, когда я прокомментировал строку kern / entry.S, которая выполняет:

movl    %eax, %cr0

Что такое реальноеобъяснение этого?Поскольку часть кода говорит о многих вещах, которые делают, но я действительно не понимаю, почему, если я прокомментирую эту строку кода, она взорвется.

entry:
movw    $0x1234,0x472           # warm boot


movl    $(RELOC(entry_pgdir)), %eax
movl    %eax, %cr3
# Turn on paging.
movl    %cr0, %eax
orl $(CR0_PE|CR0_PG|CR0_WP), %eax
movl    %eax, %cr0

mov $relocated, %eax
jmp *%eax

1 Ответ

0 голосов
/ 11 октября 2018

Эта ошибка QEMU означает "ваша гостевая программа просто перепрыгнула в какое-то неверное место";это почти всегда результат глючной гостевой программы, но ранее эмуляция QEMU была не в состоянии справиться.В более новых версиях QEMU (начиная с версии 3.1, которая еще не выпущена) мы сможем обрабатывать выполнение из чего-то другого, кроме оперативной памяти, поэтому мы сможем продолжить эмуляцию гостя.Конечно, поскольку выполнение из случайной не отображенной памяти не имеет смысла, есть вероятность, что гость просто будет сидеть в цикле, принимая исключения, или иначе сидеть там, очевидно, ничего не делая.

В этом конкретном случае вы прокомментировалистрока кода, которая включает MMU, то есть код, следующий сразу за ним, который переходит на виртуальный адрес при условии, что подкачка включена, потерпит крах, когда он попытается выполнить инструкцию в цели перехода, потому что без включенного MMU нет ничегопо этому адресу.

...