IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

Le fonctionnement de boot.s de Linux Kernel v0.01


Sujet :

Linux

  1. #1
    Membre confirmé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Par défaut Le fonctionnement de boot.s de Linux Kernel v0.01
    bonsoir
    j'ai lus cet article http://en.wikibooks.org/wiki/X86_Assembly/Bootloaders sur le bootloader
    ils ont mentionné un code de boot.s de Linux Kernel v0.01
    selon le commentaire, le programme est chargé initialement dans 0x7c00, en suit le programme se déplacera à 0x90000
    si j'ai compris le code , le deplacement a été effectuer à la fin de cet portion de code, à l'aide de l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BOOTSEG = 0x07c0
    INITSEG = 0x9000
    SYSSEG  = 0x1000                        | system loaded at 0x10000 (65536).
    ENDSEG  = SYSSEG + SYSSIZE
     
    entry start
    start:
            mov     ax,#BOOTSEG
            mov     ds,ax
            mov     ax,#INITSEG
            mov     es,ax
            mov     cx,#256
            sub     si,si
            sub     di,di
            rep
            movw
            jmpi    go,INITSEG
    go:     mov     ax,cs
    la question que je veux poser, c'est comment il a pu déplacer son code, je voir un branchement, il n'a pas copie les instructions d'un addresse vers une autre,
    pouvez vous m'expliqué et merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 150
    Billets dans le blog
    150
    Par défaut
    Bonjour,

    Je ne crois pas qu'il se déplace, mais plutôt qu'il saute dans une autre portion du code, pour atteindre celui qu'il a besoin d'exécuter.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 490
    Par défaut
    Hello à tous,

    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Je ne crois pas qu'il se déplace, mais plutôt qu'il saute dans une autre portion du code, pour atteindre celui qu'il a besoin d'exécuter.
    En fait, dans ce cas précis, il y a bien déplacement du code.


    Citation Envoyé par linux user Voir le message
    si j'ai compris le code , le deplacement a été effectuer à la fin de cet portion de code, à l'aide de l'instruction
    Pas tout-à-fait : le code a été déplacé, ou plus précisément copié de 0000:7c00 à 9000:0000 par le début du code, c'est-à-dire depuis la première jusqu'à l'instruction que tu cites.

    Officiellement, les 512 octets du bootloader, issus du secteur du MBR, sont chargés par le BIOS d'un PC en 0000:7c00 et ce sont ces valeurs précises que l'on retrouve dans les registres : CS=0000 et IP=7c00. Mais le programme considère qu'il est implanté en fait en 07C0:0000, ce qui correspond rigoureusement au même endroit, mais permet de dire à l'assembleur qu'on démarre en 0000, ce qui est utile pour calculer l'adresse des étiquettes.

    Une fois, le code déplacé en 9000:0000, c'est-à-dire à une adresse débutant réellement en 0000, l'instruction effectue un far call vers le segment INITSEG, soit 0x9000 et l'offset de l'instruction suivante, reperée par « go: », et qui demeure le même à l'emplacement de destination.

    L'exécution se poursuit alors normalement, mais depuis ce nouvel endroit.


    Voici l'extrait de code concerné avec des commentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    BOOTSEG = 0x07c0
    INITSEG = 0x9000
    SYSSEG  = 0x1000                        | system loaded at 0x10000 (65536).
    ENDSEG  = SYSSEG + SYSSIZE
     
    entry start
    start:
            mov     ax,#BOOTSEG    ; AX=07C0 (Segment de départ)
            mov     ds,ax          ; DS=AX (On ne peut pas le charger directement)
            mov     ax,#INITSEG    ; AX=9000 (Segment d'arrivée)
            mov     es,ax          ; ES=AX (Même problème)
            mov     cx,#256        ; CX = 256 (car 256 mots de 16 bits donc 512 octets)
            sub     si,si          ; SI=0
            sub     di,di          ; DI=0
            rep                    ; Répète CX fois l instruction qui suit
            movw                   ; Charge [DS:SI] dans AX et copie-le dans [ES:DI], puis fais avancer les deux pointeurs de seize bits chacun
            jmpi    go,INITSEG     ; Saute vers l instruction suivante mais dans la zone de destination
    go:     mov     ax,cs          ;

  4. #4
    Membre confirmé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Par défaut
    Citation Envoyé par Obsidian Voir le message

    Une fois, le code déplacé en 9000:0000, c'est-à-dire à une adresse débutant réellement en 0000, l'instruction effectue un far call vers le segment INITSEG, soit 0x9000 et l'offset de l'instruction suivante, reperée par « go: », et qui demeure le même à l'emplacement de destination.
    Pour quoi, il cherche une adresse qui debute avec 0000 ? la première aussi l'est aussi

  5. #5
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            ; nothing to do                                                         
     
            times   510-($-$$)      db      0       ; pad remainder of boot         
                                                    ; sector with 0 s               
                                    dw      0xAA55  ; std PC boot signature
    je crois que c'est pour éviter de forcer la reconnaissance de la signature "boot" pour passer du boot secteur au load kernel ou un truc du genre... mais bon.. là je suis pas sur de mon coup parce que là j'ai juste gardé cette petite note telle que.... sans la commenter...
    bref pour une sort d'alignement des adresses quoi

  6. #6
    Membre confirmé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            movw                   ; Charge [DS:SI] dans AX et copie-le dans [ES:DI], puis fais avancer les deux pointeurs de seize bits chacun
    j'ai essayé cette instruction sur mon ordinateur (GAS), et ça n'a pas marché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.s:12: Error: number of operands mismatch for `mov'
    Pour quoi ?

  7. #7
    Membre actif Avatar de Ethan 0x21
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2006
    Messages : 120
    Par défaut
    Bonjour,

    movw est un opcode binaire (il prend 2 opérandes : movw seg-reg, seg-reg ), l'assembleur utilisé par la personne ayant posté le boot secteur, devais permettre de définir implicitement le selecteur de segment et l'offset par défaut, ce qui n'est point le cas sous gas.

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 490
    Par défaut
    Citation Envoyé par linux user Voir le message
    Pour quoi, il cherche une adresse qui debute avec 0000 ? la première aussi l'est aussi
    Non, l'adresse initiale est 0000:7c00, mais peu importe. Ce qui est fait ici, c'est déplacer le code plus loin en mémoire car la suite va probablement avoir besoin de travailler en mémoire conventionnelle.

    Citation Envoyé par frp31 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            ; nothing to do                                                         
     
            times   510-($-$$)      db      0       ; pad remainder of boot         
                                                    ; sector with 0 s               
                                    dw      0xAA55  ; std PC boot signature
    je crois que c'est pour éviter de forcer la reconnaissance de la signature "boot" pour passer du boot secteur au load kernel ou un truc du genre... mais bon.. là je suis pas sur de mon coup parce que là j'ai juste gardé cette petite note telle que.... sans la commenter...
    bref pour une sort d'alignement des adresses quoi
    Non, en l'occurence, c'est justement pour mettre en place la signature du boot. Le code ici présent va être compilé pour former le contenu du MBR. Bon, sur un disque dur, il faudra aussi intégrer à la main la table des partitions, mais il faut se souvenir que cette amorce peut se retrouver sur tous types de supports, notamment les disquettes.

    Jusqu'à une époque récente, d'ailleurs, le noyau était auto-amorçable. Il suffisait donc de faire cat bzImage > /dev/fd0 pour obtenir une disquette bootable. Attention, pas un système utilisable, mais quelque chose qui permette de démarrer le noyau qui, lui, lançait le reste. C'était pratique notamment quand on utilisait des périphériques de stockage qui n'étaient pas reconnus par le BIOS. Ce n'est plus possible aujourd'hui.

    Citation Envoyé par Ethan 0x21 Voir le message
    Bonjour,

    movw est un opcode binaire (il prend 2 opérandes : movw seg-reg, seg-reg ), l'assembleur utilisé par la personne ayant posté le boot secteur, devais permettre de définir implicitement le selecteur de segment et l'offset par défaut, ce qui n'est point le cas sous gas.
    En fait, ce n'est pas ça. Il n'existe pas de telle instruction à ma connaissance.

    Citation Envoyé par linux user Voir le message
    j'ai essayé cette instruction sur mon ordinateur (GAS), et ça n'a pas marché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a.s:12: Error: number of operands mismatch for `mov'
    Pour quoi ?
    Il s'agit en réalité… d'une faute de frappe ! :-) L'instruction implicite adéquate dans le contexte présent est MOVSW. L'extrait que tu cites est tiré du « kernel v0.01 », c'est-à-dire la toute première ébauche de système écrite par Linus en 1991, il y a maintenant 22 ans.

    Les archives du noyau nous montrent que la toute première version officielle de Linux, donc Linux 1.0 en 1993, corrige déjà ce détail.

  9. #9
    Membre confirmé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Par défaut
    vous avez raison, je l'ai trouve
    http://faydoc.tripod.com/cpu/movsw.htm

    pour movw, elle est utilisée comme mov, mais pour les operations sur 16bits

    Après la rédaction de code, doit-t-il être compilé en BIN?

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 490
    Par défaut
    Citation Envoyé par linux user Voir le message
    vous avez raison, je l'ai trouve
    http://faydoc.tripod.com/cpu/movsw.htm

    pour movw, elle est utilisée comme mov, mais pour les operations sur 16bits
    Plus précisément, l'instruction exacte est MOV, donc « Move » en anglais, suivi du suffixe « B », « W », « D » pour, respectivement « Byte » (8 bits), « Word » (16 bits) ou « Double word » (32 bits). Ces suffixes sont facultatifs et tous les assembleurs n'utilisent pas forcément la même syntaxe.

    En général, la largeur du déplacement est implicite mais quand elle a besoin d'être précisée, les assembleurs dérivant de MASM, par exemple, la spécifient explicitent à l'opérande, avec « byte ptr », par exemple.

    MOVS, quant à elle, signifie « Move String » et est une instruction à part entière, mais qui peut être soumise aux mêmes suffixes.

    Après la rédaction de code, doit-t-il être compilé en BIN?
    Oui.

  11. #11
    Membre confirmé

    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Août 2012
    Messages : 70
    Par défaut
    sous NASM , il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nasm -f bin <nom de fichier>
    comment faire cela sous GAS ? il parait qu'il n'utilise que ELF

  12. #12
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 490
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 490
    Par défaut
    Citation Envoyé par linux user Voir le message
    sous NASM , il faut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nasm -f bin <nom de fichier>
    comment faire cela sous GAS ? il parait qu'il n'utilise que ELF
    GAS va te produire un fichier objet .o destiné à être traité par le linker ld. C'est à lui qu'il faut demander d'utiliser le bon format de sortie pour le fichier final… s'il a été compilé pour le prendre en charge !

    En l'occurrence, c'est ld --oformat=binary.

Discussions similaires

  1. Boot sur son propre KERNEL linux(pb de config)
    Par didine_napster dans le forum Administration système
    Réponses: 0
    Dernier message: 07/10/2007, 23h04
  2. sous-section Linux Kernel dans la section développement Linux
    Par kromartien dans le forum Evolutions du club
    Réponses: 1
    Dernier message: 13/04/2007, 09h36
  3. Linux->kernel->sources : Documentation
    Par doccpu dans le forum Administration système
    Réponses: 3
    Dernier message: 04/09/2006, 11h03
  4. Lancement de jar au boot d'un linux
    Par Sylario dans le forum Langage
    Réponses: 1
    Dernier message: 03/07/2006, 14h02
  5. Linux Kernel Developpement
    Par Invité(e) dans le forum Linux
    Réponses: 3
    Dernier message: 13/06/2006, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo