Во-первых, если kvm отсутствует, т. Е. Вы должны "modprobe kvm" и "modprobe kvm_intel" (или modprobe kvm_amd ", если вы используете процессор на базе AMD), чтобы загрузить модуль ядра kvm перед использованием qemu. Но когдаqemu обнаружил, что kvm не загружен, что означает, что / dev / kvm не присутствует, тогда он все равно продолжит выполнение, за исключением того, что нет аппаратной виртуализации (см. http://en.wikipedia.org/wiki/X86_virtualization).
Также нет опции rom ("pxe-rtl8139.bin") showtopper, Я думаю , поэтому он все еще продолжает выполнение (см. исходный код Qemu):
./hw/pci.c:
error_report("%s: failed to find romfile \"%s\"",
Ноосновной ошибкой в вашем случае является адрес 0xa000:
«Попытка выполнить код вне ОЗУ или ПЗУ с 0x000a0000»
И это недопустимо - так как адрес выше 0xa0000 называется памятьюСм. схему в:
http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf
, в которой описана задача, необходимая при написании загрузчика (описание отверстия для памяти см. на стр. 15).
static inline tb_page_addr_t get_page_addr_code(CPUState *env1, target_ulong addr)
{
int mmu_idx, page_index, pd;
void *p;
page_index = (addr >> TARGET_PAGE_BITS) & (CPU_TLB_SIZE - 1);
mmu_idx = cpu_mmu_index(env1);
if (unlikely(env1->tlb_table[mmu_idx][page_index].addr_code !=
(addr & TARGET_PAGE_MASK))) {
ldub_code(addr);
}
pd = env1->tlb_table[mmu_idx][page_index].addr_code & ~TARGET_PAGE_MASK;
if (pd > IO_MEM_ROM && !(pd & IO_MEM_ROMD)) {
cpu_abort(env1, "Trying to execute code outside RAM or ROM at 0x" TARGET_FMT_lx "\n", addr);
}
p = (void *)((uintptr_t)addr + env1->tlb_table[mmu_idx][page_index].addend);
return qemu_ram_addr_from_host_nofail(p);
}
И, как вы можете видеть, ошибкасерьезная ошибка "cpu_abort ()".В сущности, на стр. 5 статьи загрузчика CMU выше 0xa0000 - это самый высокий адрес, к которому вы можете получить доступ во время загрузки в реальном режиме.