2010-11-04 5 views
1

j'ai trouvé this sur MSDN:alignement des données de 64 bits de Windows en termes de développement du pilote

Sur les plates-formes Windows 32 bits, le système d'exploitation corrige automatiquement les défauts d'alignement mémoire en mode noyau et les rend invisibles à l' application. Il le fait pour le processus appelant et tous les processus descendants. Cette fonctionnalité, qui réduit souvent considérablement les performances, n'a pas été implémentée dans Windows 64 bits. Ainsi, si votre pilote 32 bits contient des bogues d'alignement, vous devrez les corriger lors du portage vers Windows 64 bits.

Je suis un peu effrayé par cela. Quelqu'un peut-il me montrer un exemple du bug de désalignement ?

EDIT: Je connais fondamentalement le concept d'alignement et sa raison. Je veux juste comprendre la différence entre win32 et win64 en termes de "réparation automatique" sur l'alignement et l'impact sur mon pilote.

Répondre

2

Considérons la structure suivante, où a et c sont des mots de 32 bits et b est un octet.

|-----------a-----------|--b--|-----------c-----------| 
|  :  :  :  :  :  :  :  |  : 

Si vous allouez cette structure sur une limite de 64 bits, a et b seront tous deux alignés correctement, mais c ne sera pas, car il traverse une limite de mot 64 bits. En fait, il est impossible de mettre en forme cette structure sans pousser a ou c sur une telle limite.

Dans la pratique, les statisticiens prennent généralement une définition comme ceci:

struct { 
    int a; 
    char b; 
    int c; 
}; 

et l'organiser comme ceci:

|-----------a-----------|--b--|  padding  |-----------c-----------| 
|  :  :  :  :  :  :  :  |  :  :  :  : 

Alors qu'aucune des valeurs traverse une limite d'alignement. Mais dans la programmation du pilote, les structures doivent souvent être emballées (c'est-à-dire sans bourrage) afin de correspondre aux formats de structure de données sur fil ou sur disque. C'est à ce moment que vous pouvez entrer en conflit à moins que vous déballiez à la main les limites des mots.

+0

Merci pour les explications graphiques et littéraires. Je suis curieux de connaître le point de "réparation automatique". Cela signifie-t-il que win32 ajoutera automatiquement des paddings à la structure, et win64 ne le fera pas? Que faire si je #pragma pack (1) pour les deux? – solotim

+0

Le remplissage est effectué par le compilateur, quelle que soit l'architecture, et non par une version/architecture donnée de Windows. Vous pouvez supprimer le comportement par défaut du compilateur en utilisant '#pragma pack (1)' et ainsi forcer l'empaquetage serré, ce qui est souvent nécessaire pour le codage du protocole, mais c'est là que le problème commence. En résumé, si vous respectez le comportement par défaut du compilateur, vous pouvez oublier les problèmes d'alignement. –

+0

@solotim L'accès à des données mal alignées provoquera une exception matérielle. Je suppose que ce que le "correctif automatique" fait est de gérer ce genre d'exceptions en décomposant l'accès mémoire mal aligné en plusieurs accès mémoire alignés, puis en retournant la valeur reconstruite. Cela signifie que plusieurs instructions s'exécutent après celle qui est défectueuse, ce qui réduit les performances. Encore une fois, ce n'est qu'une spéculation de mon côté, je ne l'ai pas confirmé moi-même. –

1

Je n'ai pas d'exemple à portée de main, mais le problème est assez simple à expliquer: vous ne pouvez accéder qu'aux données 64 bits sur des limites de 64 bits. Lorsque les données sont alignées sur 32 bits (ou plus petit), vous ne pouvez pas accéder de manière fiable à des valeurs de 64 bits car chaque seconde valeur ne sera pas sur une limite de 64 bits et cet accès générera une exception.

Les machines WIntel sont très tolérantes à ces fautes mais la plupart des autres architectures, comme ARM, lèvent des exceptions sur tous les problèmes d'alignement, de sorte que tous les modèles de pointeurs sont considérés avec une extrême suspicion. Être prudent, très prudent, est le seul moyen d'avancer et d'utiliser des outils d'analyse statique comme Lint et Klocwork aident beaucoup.

+0

Merci, j'ai mis à jour la question. Au fait, Lint est-il disponible pour le code du pilote Windows? – solotim

+1

En principe, Lint est indifférent à propos de ce que fait le code et fonctionne aussi bien sur toutes les plates-formes que ce soit pour Windows ou un autre système d'exploitation, ou Intel, ARM ou tout autre processeur. Vous devez être prudent pour vous assurer qu'il est correctement configuré pour votre plate-forme et c'est parti. – 0xDEADBEEF

0

Citation this documents au cas où quelqu'un a la même préoccupation:

Si le processeur essaie de lire ou d'écrire des données mal alignées, un défaut d'alignement peut se produire. Sur le matériel x86 , les défauts d'alignement sont invisibles pour l'utilisateur. Le matériel corrige le défaut comme décrit dans le paragraphe précédent .Sur le matériel x64, défauts d'alignement sont désactivés par par défaut et le matériel de manière similaire corrige le défaut. Sur l'architecture Intel Itanium , cependant, si une erreur d'alignement se produit alors que le code en mode noyau 64 bits s'exécute, le matériel lève une exception. (Pour le code en mode utilisateur, ceci est un réglage par défaut qu'un application individuelle peut changer, bien que la désactivation de défauts d'alignement sur l'Itanium peut sérieusement dégrader les performances .)

Questions connexes