2010-05-19 10 views
3

J'ai regardé les exécutables Linux elf sur x86, la plupart du temps en utilisant IDA mais aussi gdb. Une chose que j'ai remarqué est que les fonctions sont toujours chargées aux adresses alignées par mot? Quelqu'un connaît la raison de cela? Je ne suis pas au courant de toute exigence d'instructions x86 pour démarrer aux adresses alignées. Et cela ne peut pas être dû à l'alignement de la page car la limite de la page peut toujours être n'importe où dans la fonction.Pourquoi les fonctions sont-elles chargées à des adresses alignées dans Linux x86 pour les exécutables elf?

J'apprécierais n'importe quel aperçu du tout.

Merci.

Répondre

1

Pour certaines architectures, l'alignement des données détermine la quantité de données pouvant être copiées par opération. Par exemple, essayer de copier 32 bits à partir de l'adresse 0x4000 peut prendre une opération de déplacement de 32 bits où la copie de 32 bits à partir de 0x4001 peut nécessiter 4 opérations de déplacement de 8 bits. En outre, l'utilisation de l'instruction de déplacement 32 bits sur l'adresse mal alignée peut déclencher une exception matérielle. L'exception matérielle est gérée en copiant 8 bits à la fois, mais elle est plus lente que la copie à partir d'une adresse alignée.

Edit:

Cela vaut pour toutes les données, non seulement les données qui seront exécutées. Les points d'entrée des fonctions sont donc alignés avec les cibles de commutation, les constantes de chaîne, les variables globales et d'autres données.

+0

Ceci est vrai, mais la question était pour le code, pas de données! –

+0

Mais le code est une donnée et vice versa: tout est juste un et un zéros à la fin. –

5

Vous avez raison, les instructions n'ont pas besoin d'être alignées. Sur les processeurs x86, les instructions d'assemblage sont codées en utilisant des codes de longueur variable compris entre 1 et 15 octets.

Mais les instructions sont lues à partir d'un cache généralement aligné sur 64 octets, et certaines parties du pipeline d'exécution fonctionnent plus rapidement lorsque le code est correctement aligné: le décodage, boucles, prédiction de branchement, etc.

La meilleure source d'information sur ce sont les documents d'Agner Fog: http://www.agner.org/optimize/