assembleur 64 bits et interface noyau

assembleur 64 bits et interface noyau - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 18-01-2015 à 13:29:26    

Bonjour
J'ai installé sur ma machine une distribution xubuntu14.04.1 en 64 bits
j'ai installé nasm et fait un petit code en 64 bits en utilisant les appels systèmes par int 80h
en cherchant de la doc sur ces appels, je me suis aperçu que les numéros d'appels et le passage des paramètres avaient changé entre le 32 bits et le 64 bits.
quand j'ai fait mon code, j'ai utilisé les appels 32 bits dans un source 64 bits et à l'exécution, ça n'a posé aucun problème alors que cela aurait du normalement planter la console ou du moins provoquer un core dump
ma question est : pourquoi un appel système 32 bits fonctionne-t-il sur un système 64 bits ?
est-ce que les appels systèmes 64 bits sont-ils implémenter sans toutes les versions du noyaux ?
ou ai-je merdé quelque part ?
je suis bien conscient que ces interrogations sont adressées à des experts qui ne fréquentent pas forcément ce forum
donc si vous savez où je peux poser la question ça m'intéresserait beaucoup.
Merci


---------------
je suis né fatigué et fait pour me reposer
Reply

Marsh Posté le 18-01-2015 à 13:29:26   

Reply

Marsh Posté le 13-04-2015 à 13:54:27    

Première question:  
Es-tu sûr que ton OS est en 64 bit ?  
 
Second point:  
L'appel à l'interruption int80h est dédiée au mode 32 bit.  
Donc cela fonctionne peu ou prou sur un système 64bit pour assurer la compatibilité et permettre au code 32bit de tourner sur du 64.  
 
Les appels systèmes 64bit sont différents et ne passent pas par l'interruption int80h mais passent par l'appel à syscall avec le numéro de ta fonction stocké dans RAX.  
 
Les appels systèmes 64 bits sont donc présents dans tous les noyaux linux 64bits.
 
Si tu veux voir du code 64 bits intel et comprendre le mécanisme de syscall regarde mon repo github : https://github.com/netmonk/asm/blob/master/fibo2.asm
 
Plus d'information ici : http://stackoverflow.com/questions [...] -on-x86-64


Message édité par netmonk le 13-04-2015 à 14:00:00
Reply

Marsh Posté le 13-04-2015 à 15:26:59    

Tu pourrais desassembler to .o et poster le resultat  de quelques commandes (surtout le int 0x80) ?
 
Ainsi qu'un "file <ton_executable>" pour voir s'il apparait en ELF-32 ou ELF-64 ?

Reply

Marsh Posté le 13-04-2015 à 15:29:49    

Une autre question : es-tu sûr d'avoir spécifié "-f elf64" dans ta ligne de commande NASM ?

Reply

Marsh Posté le 14-04-2015 à 13:44:05    

bonjour et merci de m'avoir répondu :jap:  
comme indiqué, je suis sur une xubuntu 14.04.1 en 64 bits.

Citation :

db__@albireo:~/asm$ file ./essai_rep64_3
./essai_rep64_3: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), statically linked, stripped


le source fait 233 lignes
je ne connais pas de désassembleur vu que je n'en utilise pas
j'ai regardé le lien donné. j'utilise le même type de génération sans les options -g  et -F
je fais un strip et un sstrip en plus à la fin.
l'exemple est très clair, et j'essaierai ce soir une version avec syscall
je ne connais pas cette mnémonique assembleur et ignore ce qu'elle fait exactement.
Un lien avec la liste des appels systèmes en 64 bits exhaustif serait le bienvenue surtout en Français vu mon extraordianire médiocrité en anglais.


---------------
je suis né fatigué et fait pour me reposer
Reply

Marsh Posté le 14-04-2015 à 14:06:49    

Pour la liste des syscalls il faudra me laisser le temps de traduire.  
Sinon tu peux trouver là : http://blog.rchapman.org/post/3680 [...] for-x86-64

Reply

Marsh Posté le 14-04-2015 à 23:50:06    

j'ai fait les modifications dans mon source pour syscall
cela fonctionne sauf pour getdents
le fait d'avoir changer l'affectation des registres oblige à repenser tout le code pour l'optimiser


---------------
je suis né fatigué et fait pour me reposer
Reply

Marsh Posté le 15-04-2015 à 12:22:59    

résolu : j'ai réussi à faire un portage de 32 bits à 64 bits.
le fait d'avoir complètement changé les appels systèmes complique énormément la tâche.
Les numéros sont différends, les paramètres n'utilisent pas les mêmes registres, la taille des paramètres et structures changent.
pour getdents, j'ai plus vite fais d'écrire et analyser le résultat plutôt que d'essayer de comprendre les alias multiple dans les multiples inclusions de dirent.h
j'ignorais qu'il y avait autant de polytechniciens à programmer sur linux :D
merci encore de m'avoir mis sur la voie :jap:  


---------------
je suis né fatigué et fait pour me reposer
Reply

Marsh Posté le 15-04-2015 à 14:41:10    

Content de voir que tu as solutionné ton soucis.

Reply

Marsh Posté le 16-04-2015 à 18:05:10    

tout n'est pas rose dans le 64 bits.
l'instruction aaa si pratique pour faire des conversions hexa n'existe plus :fou:
l'utilisation des registres ah, bh, ch, dh se complique
je n'arive pas à déterminer si rbx, rcx sont garantis non modifié au retour d'un syscall
je ne parviens pas à savoir s'il est possible d'utiliser les registres r11 à r15 sans risque d'affecter le système
Je n'ai trouvé que de la doc en anglais dans laquelle je patauge totalement.


---------------
je suis né fatigué et fait pour me reposer
Reply

Marsh Posté le 16-04-2015 à 18:05:10   

Reply

Marsh Posté le 16-04-2015 à 20:09:37    

Citation :

. A system-call is done via the syscall instruction. The kernel destroys
registers %rcx and %r11.


 
Ce qui veut dire que les appels systèmes se font par l'utilisation de syscall, et les valeurs dans les registres rcx et r11 sont détruites par le noyau.  
 
Donc si tu utilises ces deux registres, push avant et pop après le syscall, en utilisant la pile comme stockage temporaire des valeurs.
Sinon mov les valeurs dans d'autres registres non impactés par le syscall.


Message édité par netmonk le 16-04-2015 à 20:11:34
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed