Firstly, if there is no kvm, that is, u must "modprobe kvm" and "modprobe kvm_intel" (or modprobe kvm_amd "if you are running on an AMD processor) in order to load the kvm kernel module before using qemu. Qemu found that there is no kvm loaded, i.e. / dev / kvm no, then it will continue to execute anyway, except that there is no hardware virtualization (see http://en.wikipedia.org/wiki/X86_virtualization ).
There is also no showstopper rom ("pxe-rtl8139.bin") option. I think that ’s why it continues to work (see Qemu source code):
./hw/pci.c: error_report("%s: failed to find romfile \"%s\"",
But the main error in your case is the address 0xa000:
"Attempting to execute code outside RAM or ROM at 0x000a0000"
And this is illegal - since an address exceeding 0xa0000 is called a memory hole. See the chart in:
http://www.cs.cmu.edu/~410-s07/p4/p4-boot.pdf
which describe the task needed to write the bootloader (see page 15 for a description of the memory hole).
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); }
And as you can see, the error is a serious serious error of "cpu_abort ()". Essentially, on page 5 of the article, the CMU is higher than the higher. 0xa0000 is the highest address that you can access at boot time in real time.
Peter Teoh
source share