jeudi 12 décembre 2019

Chapitre 75 : Assembleur ARM 64 bits : lecture écriture de fichiers


Avec la version Buster et le container 64 bits que j’utilise, je n’ai pas pu faire fonctionner les accès au GPIO car il manque la description des peripheriques /dev/mem et /dev/gpiomem. Ces périphériques sont necessaires car Linux interdit les accès directs aux registres du gpio. En attendant qu’une version de Buster corrige ces problèmes, je vous propose de voir les lectures/écritures des fichiers en assembleur 64 bits.

Dans le programme lectfic1.s nous effectuons l’ouverture et la lecture d’un fichier simple. Pour cela il nous faut rechercher le code de l’appel système linux Open mais hélas qui n’existe pas en 64 bits. Il faut se rabattre sur le code OPENAT valeur 56 mais qui necessite une adaptation par rapport à l’Open 32 bits. Il faut transmettre dans le registre x0, une constante AT_FDCWD pour indiquer que le nom du fichier (avec son répertoire) s’effectuera à partir du répertoire courant. Ceci implique que nous ne pouvons pas ouvrir des fichiers avec un nom fixe partant de la racine comme /home/pi/toto.txt. Par contre, nous ouvrirons un fichier de la forme ../../rep1/rep2/toto.txt. Il doit y avoir une solution mais je n’ai pas encore trouvé.
Ensuite la lecture (code 63) et la fermeture (code 57) du fichier ne posent aucun problème

Le programme ecritfic2.s monte l’écriture dans un fichier. La seule petite difficulté provient de l’attribution des droits lors de l’ouverture du fichier. En effet il faut préciser dans le paramètre mode le masque à attribuer. La documentation sur les droits indique par exemple qu’il faut mettre 644 pour autoriser le propriétaire à lire et à écrire sur le fichier ainsi crée et les autres ne sont autorisés qu’en lecture. Sauf que ce code doit être mis en octal sinon les résultats sont bizarroïdes et donc il doit être écrit 0644 (avec un zéro devant !!) pour que l’assembleur as le comprenne.

Le programme lectecrfic.s reprend l’exemple donné au chapitre 8 de ce blog et écrit en assembleur 32 bits. Ici je l’ai adapté pour le 64 bits. Cette adaptation m’a permis de dresser une liste des opérations à effectuer pour passer d’un programme ARM 32 bits à 64 bits :

    Changer le symbole des  commentaires :   @ -> //
    Modifier tous les registres r en x
    Remplacer tous les push et pop  par des stp, str ldp ldr.
    Remplacer le r7 par x8 pour les call system
    Remplacer swi par svc pour les call system
   Vérifier le passage des paramètres pour les call system (x0 à x7 puis les autres sur la pile).
   Remplacer les .int par des .quad pour les définitions d’adresse
   Vérifier et modifier les descriptions de données dans la .data et la .bss
   Changer le nom du fichier des constantes et celui des macros.
   Changer les instructions conditionnelles : moveq  par exemple
   Modifier les instructions de type add x1,#1   en add x1,x1,1
   Modifier les déplacements:   lsl x1,#2   en lsl x1,x1,2

Aucun commentaire:

Enregistrer un commentaire