質問

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 ファイルが見つからないというメッセージも表示されます。それで、誰か私が間違っていることを教えてください。あなたの時間と労力を感謝します。

役に立ちましたか?

解決

ベン・ヴォイトによる提案はあなたの問題ではありません。カーネルを実行するとまったく同じ出力がありますが、問題は発生しません。

Qemu Abortsの理由は次のとおりです。

QEMU:致命的:0x000A0000でRAMまたはROM以外でコードを実行しようとしています

これは、カーネルが無効なメモリの位置からコードを実行しようとすることを意味します。したがって、それはあなたのカーネルのバグであり、Qemuとは何の関係もありません。

編集: あなたのバグがどこにあるかについてのヒント。レジスタダンプを見ると、最後に実行された命令が640K(0x9FFFB)をわずかに下回っていることは明らかです。私のマシンでは、QEMUはすべてのメモリを637K〜1Mの間で利用できないと報告しています。利用できないメモリを使用しないように常に注意する必要があります。安全な賭けは、メモリマップを取得できるまで637k未満にとどまることです 知る 使用できるメモリ。

他のヒント

まず、kvm がない場合、つまり、qemu を使用する前に、「modprobe kvm」と「modprobe kvm_intel」(AMD ベースのプロセッサを使用している場合は modprobe kvm_amd)を使用して、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 は、リアルモード起動中にアクセスできる最大のアドレスです。

これを修正する必要があります:

PCI_ADD_OPTION_ROM:romfile "pxe-rtl8139.bin"を見つけられなかった

必要なファイル(QEMUの再インストール?)を提供するか、VM構成を変更してネットワークカードを削除します。仮想ネットワークは、このファイルなしでは動作できません。

os.binの代わりに有効なbzimageを指すべきだと思います。個人的には、KVM -Kernel Arch/x86/boot/bzimageを使用しています。

2つの素敵なチュートリアルがあります

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帰属
所属していません StackOverflow
scroll top