8

我创建了一个 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

4 回答 4

6

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

QEMU 中止的原因如下:

qemu:致命:试图在 0x000a0000 处执行 RAM 或 ROM 之外的代码

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

编辑:只是提示您的错误可能在哪里。查看您的寄存器转储,很明显最后执行的指令刚好低于 640K(在 0x9fffb 处)。在我的机器上,QEMU 将 637K 和 1M 之间的所有内存报告为不可用。您始终必须小心不要使用不可用的内存。一个安全的选择是保持在 637K 以下,直到您能够获得内存映射并知道您可以使用什么内存。

于 2011-01-08T10:51:50.427 回答
0

首先,如果没有 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") 也不是停止程序,这就是它仍然继续执行的原因(参见 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);
}

如您所见,该错误是一个严重的“cpu_abort()”严重错误。本质上,在 CMU 的引导加载程序文章的第 5 页中, 0xa0000 上方是您在实模式启动期间可以访问的最高地址。

于 2012-02-19T14:56:59.457 回答
-1

你需要解决这个问题:

pci_add_option_rom: 找不到 romfile "pxe-rtl8139.bin"

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

于 2011-01-08T01:29:12.247 回答
-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

有一些不错的技巧

于 2011-08-01T14:07:46.583 回答