2016-03-11 2 views
1

J'ai fait un petit bootloader. Maintenant, je veux charger le noyau C++. Puis-je utiliser mon petit bootloader pour ça?Il est possible d'appeler le noyau avec ce bootloader ASM? Comment?

[BITS 16] 
    [ORG 0x7C00] 
    [extern _start_kernel] 

    MOV SI, LoadString 
    CALL String 
    CALL _start_kernel 




    JMP $ 

    Print: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 


    INT 0x10 
    RET 

    String: 
    characters: 
    MOV AL, [SI] 
    INC SI 
    OR AL, AL 
    JZ stopPrint 
    CALL Print 
    JMP characters 
    stopPrint 
    RET 


    LoadString db 'Loading...', 0 


    TIMES 510 - ($ - $$) db 0 
    DW 0xAA55 

C'est bootloader très simple et cela est la première fois que je fais bootloader (avec tutoriel). J'utilise NASM dans Windows pour compiler le code asm.

+2

Pas réel de répondre à cette question, car il est très vague. Ecrivez plus concret ce que vous voulez faire ... Maintenant, vous pouvez obtenir seulement réponse "Oui" ou "Non" sur votre question actuelle et c'est très vague aussi :) D'où voulez-vous charger votre noyau? périphérique brut? type fs? avez-vous préparé la place pour cela? bss/tas? Et etc ... En fait, votre question soulève plus de questions – 0xAX

+1

Parmi les autres questions soulevées, quel compilateur C++ utilisez-vous? Génère-t-il du code 16 bits? Si ce n'est pas le cas, votre bootloader devra également se préoccuper de mettre le processeur en mode protégé 32 bits avant même d'essayer d'exécuter du code 32 bits. Vous pourriez avoir un temps plus facile si vous utilisez un chargeur de démarrage compatible Multiboot tel que _GRUB_ qui gère ce genre de corvée pour vous. –

+0

Avez-vous un fichier 'linker.ld'? Vous devez lier le code Assembly avec votre chargeur de démarrage, sinon vous ne pouvez pas appeler de fonctions dans votre fichier noyau. – Razor

Répondre

3

Maintenant, je veux charger le noyau C++. Puis-je utiliser mon petit bootloader ASM pour cela?

Non avec le code que vous avez écrit parce que dans un bootloader il est votre responsabilité d'apporter réellement le fichier du noyau en mémoire. Le simple fait de déclarer une étiquette externe [extern _start_kernel] ne fera rien.
Rechercher dans le forum et vous trouverez des exemples qui gèrent cela.

Une note sur vos efforts jusqu'à présent.
Parce que vous avez écrit [ORG 0x7C00] vous voulez que vos adresses soient relatives à l'adresse linéaire 0. Ici aussi, il est votre responsabilité pour vous assurer que les registres de segments sont configurés en conséquence. Vous devez ajouter à votre code:

xor ax, ax 
mov ds, ax 
MOV SI, LoadString 
+3

Comme posté «_start_kernel» est un extern, ce qui impliquerait que la routine '_start_kernel' est liée au chargeur de démarrage. Dans ce cas, il ne serait pas nécessaire de lire dans le noyau. Cependant, il y a plusieurs avertissements: 1) ce n'est pas la façon dont les bootloaders sont généralement implémentés - ils lisent généralement dans le noyau 2) le BIOS ne lira qu'un seul secteur pendant le démarrage, donc le bootloader et la routine _start_kernel secteur unique. Même avec un lecteur sectoriel 4K natif qui ne sera pas vraiment un noyau. –

1

Si vous souhaitez appeler une fonction externe dans votre noyau, vous devez d'abord avoir déclaré dans votre fichier noyau puis l'appeler de votre bootloader. Vous aurez également besoin d'un fichier linker qui relie le noyau au bootloader dans un fichier binaire séparé qui peut ensuite être démarré en utilisant GRUB. Rendez-vous sur le site this qui vous montre comment démarrer votre bootloader à partir du noyau, puis le lier à l'aide d'un fichier de liaison. Vous devrez peut-être avoir GCC compilateur croisé si vous avez linux et si vous prévoyez d'utiliser le code sur ce site.