Question

J'ai créé un noyau C, et je charger le noyau dans l'émulateur QEMU. Mais quand je charge le noyau, il semble planter QEMU et il se plaint qu'il ne peut pas accéder au dossier kvm. Est-ce que cela signifie que kvm manque, ou que je ne suis pas d'administrateur; parce que je me suis connecté en tant qu'administrateur racine. Voici les informations d'erreur, qui a pris naissance à partir du terminal:

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

L'erreur semble aussi afficher des informations, qui semble être des registres MSNA, et il se plaint qu'il ne pouvait pas trouver un fichier ROM. Donc, quelqu'un pourrait-il s'il vous plaît me dire ce que je fais mal, je vous remercie de votre temps et des efforts.

Était-ce utile?

La solution

La suggestion faite par Ben Voigt n'est pas votre problème. J'ai la même sortie exacte quand je lance mon noyau et il ne pose aucun problème.

Les Abandonne qemu raison est la suivante:

  

qemu: fatale: Essayer d'exécuter du code RAM ROM à l'extérieur ou à 0x000a0000

Cela signifie que vos essais du noyau pour exécuter du code à partir d'un emplacement de mémoire non valide. Ainsi, il est un bug dans le noyau et n'a rien à voir avec QEMU.

Modifier Juste un indice sur l'endroit où votre bug peut être. En regardant votre décharge de registre, il est clair que la dernière instruction exécutée est juste en dessous de 640K (à 0x9fffb). Sur ma machine, QEMU rapporte toute la mémoire entre 637K et 1M comme indisponible. Il faut toujours faire attention à ne pas utiliser la mémoire disponible. Une valeur sûre est juste en dessous de séjour 637K jusqu'à ce que vous êtes en mesure d'obtenir une carte de mémoire et savoir ce que la mémoire vous pouvez utiliser.

Autres conseils

Tout d'abord, s'il n'y a pas kvm, c.-à-u doit « modprobe kvm » et « modprobe kvm_intel » (ou modprobe kvm_amd » si vous êtes sur base de processeur AMD), pour charger le module noyau kvm avant d'utiliser qemu. Mais quand qemu détecté il n'y a pas kvm chargé, sens / dev / kvm n'est pas présent, alors il sera toujours aller de l'avant avec l'exécution, sauf qu'il n'y a pas de virtualisation matérielle (voir http://en.wikipedia.org/wiki/X86_virtualization ).

Il n'est la ROM d'option ( "pxe-rtl8139.bin") le Showstopper, Je pense , ce qui est la raison pour laquelle il continue encore l'exécution (voir Qemu code source) :

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

Mais l'erreur principale dans votre cas est l'adresse 0xA000:

"Essayer d'exécuter du code RAM ROM à l'extérieur ou à 0x000a0000"

Et ce qui est illégal - comme l'adresse supérieure à 0xa0000 est appelé le trou de mémoire. Reportez-vous au schéma:

http://www.cs.cmu.edu /~410-s07/p4/p4-boot.pdf

qui décrivent la tâche nécessaire à la rédaction d'un bootloader (voir page 15 pour la description sur le trou de mémoire).

    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);
}

Et comme u peut le voir, l'erreur est un grave « cpu_abort () » erreur grave. Pour l'essentiel, à la page 5 bootloader du CMU article ci-dessus 0xa0000 est la plus haute adresse u accessible pendant realmode bootup.

Vous devez résoudre ce problème:

  

pci_add_option_rom: pas réussi à trouver romfile "pxe-rtl8139.bin"

Soit fournir le fichier nécessaire (réinstaller qemu?) Ou modifier la configuration VM et retirez la carte réseau. Le réseau virtuel ne peut pas fonctionner sans ce fichier.

Je pense, vous devez pointer vers bzImage valide au lieu de os.bin. Personnellement, j'utilise kvm -kernel arch / x86 / boot / bzImage.

Il y a deux bons tutoriels,

http://softperience.eu/wiki/ Wiki.jsp? page = développement% 20Linux% 20Kernel% 20with% 20Netbeans

http://softperience.eu/ wiki / Wiki.jsp? page = Avancé% 20Linux% 20Kernel% 20Developing% 20with% 20Netbeansw

avec quelques tours de belles

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top