QEMU падает при загрузке ядра - PullRequest
7 голосов
/ 08 января 2011

Я создал ядро ​​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, и жалуется, что не может найти файл ПЗУ. Так может кто-нибудь сказать мне, что я делаю неправильно, я был бы признателен за ваше время и усилия.

Ответы [ 4 ]

6 голосов
/ 08 января 2011

Предложение, сделанное Беном Фойгтом, не является вашей проблемой.У меня точно такой же вывод, когда я запускаю свое ядро, и оно не вызывает никаких проблем.

Причина, по которой QEMU прерывает работу:код вне ОЗУ или ПЗУ по адресу 0x000a0000

Это означает, что ваше ядро ​​пытается выполнить код из недопустимого места в памяти.Таким образом, это ошибка в вашем ядре, и она не имеет ничего общего с QEMU.

Редактировать: Просто подсказка о том, где может быть ваша ошибка.Глядя на дамп реестра, видно, что последняя выполненная инструкция находится чуть ниже 640K (при 0x9fffb).На моей машине QEMU сообщает, что вся память между 637 КБ и 1 МБ недоступна.Вы всегда должны быть осторожны, чтобы не использовать недоступную память.Безопасная ставка - просто оставаться ниже 637K, пока вы не сможете получить карту памяти и знать какую память вы можете использовать.

0 голосов
/ 19 февраля 2012

Во-первых, если kvm отсутствует, т. Е. Вы должны "modprobe kvm" и "modprobe kvm_intel" (или modprobe kvm_amd ", если вы используете процессор на базе AMD), чтобы загрузить модуль ядра kvm перед использованием qemu. Но когдаqemu обнаружил, что kvm не загружен, что означает, что / dev / kvm не присутствует, тогда он все равно продолжит выполнение, за исключением того, что нет аппаратной виртуализации (см. http://en.wikipedia.org/wiki/X86_virtualization).

Также нет опции rom ("pxe-rtl8139.bin") showtopper, Я думаю , поэтому он все еще продолжает выполнение (см. исходный код Qemu):

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

Ноосновной ошибкой в ​​вашем случае является адрес 0xa000:

«Попытка выполнить код вне ОЗУ или ПЗУ с 0x000a0000»

И это недопустимо - так как адрес выше 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 ()".В сущности, на стр. 5 статьи загрузчика CMU выше 0xa0000 - это самый высокий адрес, к которому вы можете получить доступ во время загрузки в реальном режиме.

0 голосов
/ 01 августа 2011

Я думаю, вы должны указать на действительный 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

с несколькими приятными трюками

0 голосов
/ 08 января 2011

Вам нужно это исправить:

pci_add_option_rom: не удалось найти ромфайл "pxe-rtl8139.bin"

Либо предоставьте необходимый файл (переустановите qemu?), Либо измените конфигурацию виртуальной машины и удалите сетевую карту. Виртуальная сеть не может работать без этого файла.

...