Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1303 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  assembleur 64 bits et interface noyau

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

assembleur 64 bits et interface noyau

n°1372199
db__
spécialiste de l'à peu près
Posté le 18-01-2015 à 13:29:26  profilanswer
 

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
mood
Publicité
Posté le 18-01-2015 à 13:29:26  profilanswer
 

n°1375636
netmonk
Posté le 13-04-2015 à 13:54:27  profilanswer
 

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
n°1375644
doublebeur​re
Posté le 13-04-2015 à 15:26:59  profilanswer
 

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 ?

n°1375646
netmonk
Posté le 13-04-2015 à 15:29:49  profilanswer
 

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

n°1375676
db__
spécialiste de l'à peu près
Posté le 14-04-2015 à 13:44:05  profilanswer
 

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
n°1375677
netmonk
Posté le 14-04-2015 à 14:06:49  profilanswer
 

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

n°1375717
db__
spécialiste de l'à peu près
Posté le 14-04-2015 à 23:50:06  profilanswer
 

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
n°1375734
db__
spécialiste de l'à peu près
Posté le 15-04-2015 à 12:22:59  profilanswer
 

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
n°1375742
netmonk
Posté le 15-04-2015 à 14:41:10  profilanswer
 

Content de voir que tu as solutionné ton soucis.

n°1375771
db__
spécialiste de l'à peu près
Posté le 16-04-2015 à 18:05:10  profilanswer
 

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
mood
Publicité
Posté le 16-04-2015 à 18:05:10  profilanswer
 

n°1375774
netmonk
Posté le 16-04-2015 à 20:09:37  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  assembleur 64 bits et interface noyau

 

Sujets relatifs
Debian passé d'une interface graphique à une interface ligne de commaniptables, selection d'interface
OpenBSD : problème CARP IPv6 (IPv4+IPv6 sur le même interface)explorateur de fichier sous interface web
Erreur Compilation RT3298 + modification noyautrisquel - distribution avec noyau 100% libre
Exécuter des applications 32 bits avec un noyau 64 bitsDebian 7.2 - interface graphique volatilisée
La NSA a un code "légitime" s’exécutant dans le noyau Linux et Android 
Plus de sujets relatifs à : assembleur 64 bits et interface noyau


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR