簡體   English   中英

加載內核時QEMU崩潰

[英]QEMU Crashes When Loading Kernel

我已經創建了一個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文件。 所以有人可以告訴我我做錯了什么,我很感激你的時間和努力。

Ben Voigt提出的建議不是你的問題。 當我運行我的內核時,我有完全相同的輸出,它不會導致任何問題。

QEMU中止的原因如下:

qemu:致命:嘗試在0x000a0000的RAM或ROM外執行代碼

這意味着您的內核嘗試從無效的內存位置執行代碼。 因此,它是內核中的一個錯誤,與QEMU無關。

編輯:只是提示你的bug可能在哪里。 查看寄存器轉儲,很明顯最后執行的指令剛好低於640K(在0x9fffb)。 在我的機器上,QEMU報告637K和1M之間的所有內存都不可用。 你總是要小心不要使用不可用的內存。 一個安全的選擇是保持在637K以下,直到你能夠獲得一張內存映射並知道你可以使用的內存。

首先,如果沒有kvm,即你必須“modprobe kvm”和“modprobe kvm_intel”(或modprobe kvm_amd“,如果你在基於AMD的處理器上),在使用qemu之前加載kvm內核模塊。但是當qemu在那里檢測到沒有加載kvm,意味着/ dev / kvm不存在,那么它仍將繼續執行,除了沒有硬件虛擬化(參見http://en.wikipedia.org/wiki/X86_virtualization )。

選擇rom(“pxe-rtl8139.bin”)也不是showstopper, 我認為 ,這就是為什么它仍然繼續執行(參見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是您在realmode啟動期間可以訪問的最高地址。

你需要解決這個問題:

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

要么提供必要的文件(重新安裝qemu?),要么更改VM配置並刪除網卡。 沒有此文件,虛擬網絡無法運行。

我想,你應該指向有效的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

幾個不錯的技巧

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM