首页 文章

加载内核时QEMU崩溃

提问于
浏览
7

我已经创建了一个C内核,我正在QEMU模拟器中加载内核 . 但是当我加载内核时,它似乎崩溃QEMU并且它抱怨它无法访问kvm文件夹 . 这是否意味着缺少kvm,或者我不是管理员;因为我以root管理员身份登录以下是源自终端的错误信息:

danny@ubuntu:~/Desktop$ sudo qemu -kernel os.bin
open /dev/kvm: No such file or directory
Could not initialize KVM, will disable KVM support
pci_add_option_rom: failed to find romfile "pxe-rtl8139.bin"
qemu: fatal: Trying to execute code outside RAM or ROM at 0x000a0000

EAX=00004500 EBX=00000000 ECX=00000000 EDX=00000000
ESI=00000000 EDI=00000000 EBP=00000000 ESP=00009fe0
EIP=0000fdfb EFL=00000002 [-------] CPL=0 II=0 A20=1 SMM=0 HLT=0
ES =9000 00090000 ffffffff 00cf9300
CS =9020 00090200 0000ffff 00009b0f
SS =9000 00090000 0000ffff 00009300
DS =9000 00090000 0000ffff 00009300
FS =9000 00090000 0000ffff 00009300
GS =9000 00090000 0000ffff 00009300
LDT=0000 00000000 0000ffff 00008200
TR =0000 00000000 0000ffff 00008b00
GDT=     000cba40 00000017
IDT=     00000000 000003ff
CR0=00000010 CR2=00000000 CR3=00000000 CR4=00000000
DR0=00000000 DR1=00000000 DR2=00000000 DR3=00000000 
DR6=ffff0ff0 DR7=00000400
CCS=00004500 CCD=00004546 CCO=ADDB    
FCW=037f FSW=0000 [ST=0] FTW=00 MXCSR=00001f80
FPR0=0000000000000000 0000 FPR1=0000000000000000 0000
FPR2=0000000000000000 0000 FPR3=0000000000000000 0000
FPR4=0000000000000000 0000 FPR5=0000000000000000 0000
FPR6=0000000000000000 0000 FPR7=0000000000000000 0000
XMM00=00000000000000000000000000000000 XMM01=00000000000000000000000000000000
XMM02=00000000000000000000000000000000 XMM03=00000000000000000000000000000000
XMM04=00000000000000000000000000000000 XMM05=00000000000000000000000000000000
XMM06=00000000000000000000000000000000 XMM07=00000000000000000000000000000000
Aborted

该错误似乎也显示信息,似乎是NASM寄存器,它抱怨它无法找到ROM文件 . 所以有人可以告诉我我做错了什么,我很感激你的时间和努力 .

4 回答

  • -1

    Ben Voigt提出的建议不是你的问题 . 当我运行我的内核时,我有完全相同的输出,它不会导致任何问题 .

    QEMU中止的原因如下:

    qemu:fatal:尝试在0x000a0000处执行RAM或ROM外部的代码

    这意味着您的内核尝试从无效的内存位置执行代码 . 因此,它是内核中的一个错误,与QEMU无关 .

    Edit: 只是暗示你的错误可能在哪里 . 查看寄存器转储,很明显最后执行的指令刚好低于640K(在0x9fffb) . 在我的机器上,QEMU报告637K和1M之间的所有内存都不可用 . 你总是要小心不要使用不可用的内存 . 一个安全的选择是保持在637K以下,直到你能够获得一张内存映射并知道你可以使用的内存 .

  • 6

    首先,如果没有kvm,即,你必须"modprobe kvm"和"modprobe kvm_intel"(或者如果你使用的是基于AMD的处理器,则为modprobe kvm_amd),在使用qemu之前加载kvm内核模块 . 但是当检测到qemu时,没有加载kvm,意思是/ dev / kvm不存在,那么它仍将继续执行,除了没有硬件虚拟化(参见http://en.wikipedia.org/wiki/X86_virtualization) .

    选项rom("pxe-rtl8139.bin")也不是showstopper, I think ,这就是为什么它仍然继续执行(参见Qemu源代码):

    ./hw/pci.c:
            error_report("%s: failed to find romfile \"%s\"",
    

    但是你的主要错误是地址0xa000:

    “尝试在0x000a0000处执行RAM或ROM外部的代码”

    这是非法的 - 因为高于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);
    }
    

    正如你所看到的,错误是一个严重的错误 . 基本上,在CMU的第5页中bootloader article above 0xa0000是您在realmode启动期间可以访问的最高地址 .

  • 0

    你需要解决这个问题:

    pci_add_option_rom:找不到romfile“pxe-rtl8139.bin”

    要么提供必要的文件(重新安装qemu?),要么更改VM配置并删除网卡 . 没有此文件,虚拟网络无法运行 .

  • -3

    我想,你应该指向有效的bzImage而不是os.bin . 我个人使用kvm -kernel arch / x86 / boot / bzImage .

    有两个很好的教程

    http://softperience.eu/wiki/Wiki.jsp?page=Developing%20Linux%20Kernel%20with%20Netbeans

    http://softperience.eu/wiki/Wiki.jsp?page=Advanced%20Linux%20Kernel%20Developing%20with%20Netbeansw

    几个不错的技巧

相关问题