dimanche 19 janvier 2020

Chapitre 78 : assembleur ARM 64 bits : lancement d'un thread. Exécution d'une commande Unix


Je repars du programme assembleur 32 bits vu au chapitre 20 pour l’adapter à l’assembleur 64 bits. (source du programme).
Après les modifications des registres, des accès à la pile il ne reste plus qu’à trouver les codes des appels système en en 64 bits. Hélas l’appel fork ne semble pas exister en 64 bits et donc je modifie le programme pour utiliser l’appel clone.
Ces modifications refusant de fonctionner, j’effectue des recherches sur internet pour trouver la source de mon erreur. En fait, les paramètres de la fonction clone sont identiques à la fonction fork du 32 bits et donc ne correspondent pas à la première description que j’avais trouvée. En effet la documentation des appels système en 64 bits n’est pas très disponible.

J’adapte aussi les appels système pour les fonctions sleep et wait4 sans problème. Par contre je ne trouve pas de fonction pause en 64 bits.
Après recherche sur internet je trouve une solution en utilisant les appels système rt_sigprocmask et rt_sigsuspend.

Tout fonctionne parfaitement après quelques tests !!


Puis, j’ai réécrit un programme pour tester l’exécution d’une commande Linux en utilisant l’appel system execve. Pour cela je me suis contenté de lancer la commande ls –l mais vous trouverez en commentaire la chaine de caractères pour lancer une commande ping.
Ici la seule difficulté est de passer correctement les paramètres à l’appel systeme qui est un peu différent de l’appel 32 bits.
 Comme en 32 bits, vous remarquerez que l’exécution correcte de la commande interrompt le programme appelant.

Aucun commentaire:

Enregistrer un commentaire