2009-09-30 9 views
7

Selon la page Wikipedia Segmentation fault, une erreur de bus peut être causée par un accès mémoire non aligné. L'article donne un exemple sur la façon de déclencher une erreur de bus. Dans l'exemple, nous devons activer la vérification d'alignement pour voir l'erreur de bus. Que faire si nous désactivons une telle vérification d'alignement?L'accès mémoire non aligné entraîne-t-il toujours des erreurs de bus?

Le programme semble fonctionner correctement. J'ai un accès au programme de la mémoire non alignée fréquemment, et il est utilisé par un certain nombre de personnes, mais personne ne signale les erreurs de bus ou d'autres résultats étranges pour moi. Si nous désactivons la vérification de l'alignement, quel est l'effet secondaire de la mémoire non alignée? Plateformes: Je travaille sur x86/x86-64. J'ai également essayé mon programme en le compilant avec "gcc -arch ppc" sur un Mac et cela fonctionne correctement.

+0

Quelle est la plate-forme que vous travaillez sur ?? –

+0

Pavel Minaev répond largement à ma question. Je travaille sur x86/x86_64. J'ai essayé mon programme en le compilant avec "gcc -arch ppc" sur Mac et cela fonctionne correctement. – user172818

+0

Notez que l'accès mémoire non aligné (en fait, juste assignation de pointeur) est un comportement indéfini selon le standard C - donc un compilateur compatible est autorisé à faire * rien * si vous le faites (bien que tous les compilateurs ne prennent pas cette liberté). – sleske

Répondre

8
  1. Il peut être beaucoup plus lent d'accéder à la mémoire non alignée (comme dans, plusieurs fois plus lent). Toutes les plates-formes ne prennent pas en charge les accès non alignés, par exemple, avec x86 et x64, mais pas avec ia64 (Itanium), par exemple.

  2. Un compilateur peut émuler accès non aligné (VC++ fait que pour les pointeurs déclarés comme __unaligned sur ia64, par exemple) - en insérant des contrôles supplémentaires pour détecter le cas non aligné, et le chargement/stockage parties de l'objet qui chevauchent la limite d'alignement séparément. C'est même plus lent que l'accès non aligné sur les plates-formes qui le supportent nativement, cependant.

+0

Merci. Peu d'utilisateurs de mon programme travaillent sur ia64. C'est peut-être pourquoi je n'ai pas reçu de rapport de bug. – user172818

+6

Vous pouvez également ajouter # 4 qu'un système d'exploitation peut émuler l'accès non aligné sur une application en attrapant l'exception du processeur et en la corrigeant (un peu comme ce qui se passe pour une erreur de page). Ceci est plus lent que le compilateur perofrming fix ups non alignés dans le code généré. Windows peut le supporter dans ia64. –

+6

Cette réponse a été référencée dans l'article de blog * [Alignement des données pour la vitesse: mythe ou réalité?] (Http://lemire.me/blog/archives/2012/05/31/data-alignment-for-speed-myth- ou-réalité /) *. –

6

Cela dépend beaucoup de l'architecture de la puce. x86 et POWER sont très indulgents, Sparc, Itanium et VAX jettent différentes exceptions.

+0

Merci beaucoup pour la réponse – user172818

+7

En effet, j'ai récemment travaillé sur un processeur DSP qui fonctionnera heureusement en utilisant l'adresse de mémoire alignée la plus proche lorsqu'on lui demandera de fonctionner sur un processeur non aligné. *, vous avez perverti la mémoire non alignée accédant individu. –

+0

En effet, pourquoi s'embêter même à regarder ces derniers bits du tout - Real Men sait ce qu'ils font, de toute façon :) D'autre part, ce serait une architecture pratique d'utiliser des pointeurs marqués, si vous utilisez les bits ignorés pour l'étiquette ... –

2

Prenons l'exemple suivant que je viens de tester sur ARM9:

//Addresses  0  1  2 3  4  5  6  7  8 9 
U8 u8Temp[10] = {0x11,0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0x00}; 

U32 u32Var; 

u32Var = *((U32*)(u16Temp+1)); // Let's read four bytes starting from 0x22 

// You would expect that here u32Var will have a value of 0x55443322 (assuming we have little endian) 
// But in reallity u32Var will be 0x11443322! 
// This is because we are accessing address which %4 is not 0. 
+2

Je pense que vous avez une faute d'orthographe u16Temp' variable, où est sa déclaration? Je vois seulement 'u8Temp'. – amn

Questions connexes