2010-01-22 20 views
4

J'ai déjà fait une partie de mon système d'exploitation dans Assembly, mais maintenant je veux aussi créer un propre bootloader au lieu d'utiliser GRUB. Quand je développais mon test OS dans l'assemblage, je me souviens que je l'ai démarré comme ceci:Développer un chargeur de démarrage dans l'assemblage

org 0x7c00 
bits 16 

; OS Kernel Here 

times 510 - ($-$$) db 0 
dw 0xAA55 

Cela je l'ai déjà connu. Maintenant, je veux l'utiliser et exécuter le "vrai" système d'exploitation qui sera un fichier * .bin écrit dans le deuxième secteur de la disquette. Alors je veux savoir quelque chose

  • Comment puis-je faire un chargeur de démarrage dans l'Assemblée pour exécuter ce qui commencera sur le 2ème secteur de la disquette?
  • Je dois ajouter quelque chose à la source d'assemblage qui sera placée sur le 2ème secteur de la disquette?

Répondre

4

Vous utilisez int 0x13 pour charger le nombre de secteurs requis et passer à l'emplacement où vous avez placé le nouveau code. Il n'y a rien que vous devez faire dans la deuxième étape, mais vous voulez vous assurer que vous définissez DS pour être valide pour où vous chargez le code.

Exemple de ma petite archive OS:

/* BIOS loads the sectors into es:bx */ 
    pushw $STAGE1_WORKSEG 
    popw  %es 
    movw  $STAGE1_OFFSET, %bx 

read_stage1: 

    /* Try to read in a few sectors */ 
    movb  $0x2, %cl  /* Sector */ 
    movb  $0x0, %ch  /* Cylinder */ 
    movb  $0x0, %dh  /* Head */ 
    movb  $0x0, %dl  /* Drive */ 
    movb  $0x2, %ah  /* BIOS read function */ 

    /* How many sectors to load */ 
    movb  $STAGE1_SIZE, %al 
    int  $0x13 
    jnc  read_stage1_done 

    /* Reset drive */ 
    xorw  %ax, %ax 
    int  $0x13 
    jmp  read_stage1 


read_stage1_done: 

    /* Perform a long jump into stage1 */ 
    ljmp  $STAGE1_WORKSEG, $STAGE1_OFFSET 

    call  halt 

halt: 
    /* 
    * Function: halt 
    * Synopsis: Sends the processor into a permanent halted status 
    * Notes: 
    * The only way out of this is to manually reboot 
    */ 
    hlt      /* Halt the processor */ 
    jmp  halt 

C'est au format GAS si vous voulez inverser l'ordre d'opérande, car il semble que vous utilisez MSNA de l'instruction times. Les noms de variables doivent être explicites.

Si vous développez un OS de passe-temps, alors http://forum.osdev.org/ est un bon endroit pour obtenir le soutien d'autres personnes faisant la même chose. C'est un peu plus spécialisé que stackoverflow et beaucoup de choses sur le système d'exploitation peuvent être assez ésotériques.