В QEMU вылетает при загрузке ядра

Я создал ядро 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 ответов


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

причина QEMU прерывает следующее:

qemu: fatal: попытка выполнить код вне ОЗУ или ПЗУ в 0x000a0000

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

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


во-первых, если нет kvm, то есть, u должен "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") showstopper, Я думаю, поэтому он все еще продолжает выполнение (см. исходный код 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-это самый высокий адрес, к которому вы можете получить доступ во время загрузки realmode.


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

pci_add_option_rom: не удалось найти romfile " pxe-rtl8139.бин"

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


Я думаю, вы должны указать на действительный bzImage вместо os.бункер. Лично я использую 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

с несколькими хорошими трюками