Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Profil pro
    Étudiant
    Inscrit en
    août 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : août 2011
    Messages : 1
    Points : 0
    Points
    0

    Par défaut bootloader de linux 0.01

    Bonjour à tous,

    Voici quelques questions à propos d'une partie du code du fichier boot.s de linux 0.01 (excusez-moi si le sujet existe déjà, je ne voudrais pas créer une nouvelle discussion pour rien, mais je n'ai pas regardé). Voici le bout de code en question :

    Code asm :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    read_it:
    	mov ax,es
    	test ax,#0x0fff
    die:	jne die			| es must be at 64kB boundary
    	xor bx,bx		        | bx is starting address within segment
    rp_read:
    	mov ax,es
    	cmp ax,#ENDSEG		| have we loaded all yet?
    	jb ok1_read
    	ret
    ok1_read:
    	mov ax,#sectors
    	sub ax,sread
    	mov cx,ax
    	shl cx,#9
    	add cx,bx
    	jnc ok2_read
    	je ok2_read
    	xor ax,ax
    	sub ax,bx
    	shr ax,#9

    On est censé ici lire les secteurs des pistes, mais certaines lignes sont (pour moi) assez obscures. Voici les questions que je me pose :
    Que vaut la variable sectors utilisée au début de ok1_read? Et où est-elle? On peut la voir, mais juste en commentaire au début du fichier.

    Je ne comprends pas du tout la ligne add cx, bx dans ok1_read. Jusqu'à présent, on mettait le nombre de secteurs par piste dans ax, on lui soustrait le nombre de secteurs restant à lire, on met le tout dans cx, on le multiplie par 512 (pour déterminer la taille des secteurs restant à lire???), et on en arrive ensuite à add cx, bx que je ne comprends pas. La doc que j'ai trouvée n'est pas claire là-dessus *. Quel est le rapport de tout ça avec la limite de 64KB (dans les commentaires de Linus) ?? La limite d'adressage ? Que signifie-t-elle, ici, dans la lecture des secteurs ?

    Ensuite, quelqu'un pourrait-il m'expliquer les routines read_it, die et rp_read (fonctionnement + chaque ligne de code). Qu'est ce qu'ENDSEG ? Quelle valeur vaut-il ? Dans die, pourquoi mettons-nous à 0 bx (à quoi cela servirait-t-il alors de l'ajouter à cx dans ok1_read) ? Et quelle est la valeur de es dans read_it ? 0x0 ou 0x10000 (je veux dire : conserve-t-il la valeur SYSSEG plus haut dans boot.s) ? À quoi sert le "test" ici, et pourquoi ce masque ? Quel bit cherche-t-on à tester et dans quel but ? Si un spécialiste pouvait m'éclairer… excusez pour les erreurs éventuelles.

    * La doc contient ceci en commentaire de add cx, bx : « cx = cx + offset in current segment (bx) = total bytes read after the processing of this time ». Si cx est la taille des secteurs restant à lire, et bx une adresse, comment peut-on les ajouter ?

    Merci beaucoup !
    Bonne fin de journée !

  2. #2
    Membre émérite
    Avatar de Forthman
    Homme Profil pro François
    conception mécanique
    Inscrit en
    janvier 2005
    Messages
    493
    Détails du profil
    Informations personnelles :
    Nom : Homme François
    Âge : 39
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2005
    Messages : 493
    Points : 953
    Points
    953

    Par défaut

    C'est moi ou il manque pas mal de code ?

    pour lire les secteurs, il est obligatoire de trouver l'interruption 13h
    quelque part puisqu'on est en mode réel

    a+ François

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •