2010-08-12 23 views
4

J'ai compris pourquoi la mémoire devrait être alignée sur 4 octets et 8 octets en fonction de la largeur de données du bus. Mais l'instruction suivante me dérangeAlignement de la mémoire

"IoDrive exige que toutes les E/S effectuées sur un périphérique utilisant O_DIRECT doivent être de 512 octets alligned et un multiple de 512 octets."

Quel est le besoin d'aligner l'adresse sur 512 octets.

Répondre

5

Les instructions Blanket blâmant DMA pour les restrictions d'alignement de mémoire tampon sont incorrectes.

Matériel Les transferts DMA sont généralement alignés sur des limites de 4 ou 8 octets car le bus PCI peut transférer physiquement 32 ou 64 bits à la fois. Au-delà de cet alignement de base, les transferts DMA matériels sont conçus pour fonctionner avec n'importe quelle adresse fournie.

Toutefois, le matériel traite les adresses physiques, tandis que le système d'exploitation traite les adresses de mémoire virtuelle (qui est une construction en mode protégé dans le processeur x86). Cela signifie qu'un tampon contigu dans l'espace de traitement peut ne pas être contigu dans le RAM physique. Si l'on ne prend pas soin de créer des tampons contigus physiquement, le transfert DMA doit être interrompu aux limites de la page VM (typiquement 4K, éventuellement 2M).

Comme pour les tampons devant être alignés sur la taille du secteur de disque, cela est complètement faux; le matériel DMA est complètement inconscient de la taille du secteur physique sur un disque dur. Sous Linux 2.4 O_DIRECT requis 4K alignement, sous 2.6, il a été assoupli à 512B

Dans les deux cas, il s'agissait probablement d'une décision de conception visant à empêcher les mises à jour de secteur unique de franchir les limites de pages de machine virtuelle et, partant, de devoir effectuer des transferts DMA séparés. (Un tampon 512B arbitraire a 1/4 de chance de traverser une page de 4K). Par conséquent, même si le système d'exploitation est à blâmer plutôt que le matériel, nous pouvons voir pourquoi les tampons alignés sur les pages sont plus efficaces. Edit: Bien sûr, si nous écrivons des tampons de grande taille de toute façon (100 Ko), alors le nombre de frontières de pages VM croisées sera pratiquement le même que nous ayons aligné ou non sur 512B. Ainsi, le cas principal optimisé par l'alignement 512B est celui des transferts sur un seul secteur.

4

Généralement, les besoins d'alignement importants sont dus au matériel DMA sous-jacent. Les transferts de gros blocs peuvent parfois être faits beaucoup plus rapidement en exigeant des restrictions d'alignement beaucoup plus fortes que ce que vous avez ici.

Sur plusieurs processeurs ARM, le premier niveau translation table doit être aligné sur une limite de 16 Ko!

+0

comment est-il rendu plus rapide en alignant à 512 octets comme si les données sont transférées 4 octets dans un cycle – Poorna

+0

@siri, c'est le point - il pourrait ne pas être. Il pourrait être transféré 8, 16, 32, ou même plus, comme tous les 512 octets dans un seul cycle. Le matériel DMA peut faire n'importe quoi - tout dépend de l'implémentation. –

+4

@siri: Il est rendu plus rapide en n'ayant pas du tout impliqué le processeur dans la transmission (c'est le DMA), mais le matériel DMA impose parfois des limites au-delà de celles implicites dans l'architecture elle-même. – dmckee

0

Si vous ne savez pas ce que vous faites, n'utilisez pas O_DIRECT.

O_DIRECT signifie "accès direct au périphérique". Cela signifie qu'il contourne tous les caches du système d'exploitation, en touchant directement le disque (ou éventuellement le contrôleur RAID, etc.). Les accès au disque sont sur une base par secteur.

EDIT: L'exigence d'alignement est pour le décalage/taille d'E/S; Ce n'est généralement pas une exigence d'alignement de la mémoire.

EDIT: Si vous cherchez à this page (il semble être le seul coup), il dit aussi que la mémoire doit être la page alignée.