كيف يمكنني التأكد من محاذاة الذاكرة العازلة؟

StackOverflow https://stackoverflow.com/questions/1649398

  •  22-07-2019
  •  | 
  •  

سؤال

أنا أستخدم واجهة جهاز لإرسال البيانات التي تتطلب مني إعداد ملف الوصول المباشر المباشر (DMA). المخزن المؤقت، الذي يجب محاذاته على حدود 64 بت.

يتوقع محرك DMA أن تتم محاذاة المخازن المؤقتة على حدود 32 بت على الأقل (4 بايت).للأداء الأمثل ، يجب محاذاة المخزن المؤقت على 64 بت حدود (8 بايت).يجب أن يكون حجم النقل مضاعفًا لـ 4 بايت.

أنا أستعمل posix_memalign لإنشاء مخزن مؤقت مثل هذا ...

posix_memalign ((void**)&pPattern, 0x1000, DmaBufferSizeinInt32s * sizeof(int) ) )

pPattern هو مؤشر إلى int، وهو بداية المخزن المؤقت الخاص بي وهو DmaBufferSizeinInt32s عميق.

هل محاذاة المخزن المؤقت الخاص بي على 64 بت؟

هل كانت مفيدة؟

المحلول

نعم، عازلة الخاص بك هو الانحياز على 64 بت. انها تتماشى أيضا على حد 4 كبيتي (ومن هنا جاء 0x1000). إذا كنت لا ترغب في 4 KB alignement ثم تمرير 0x8 بدلا من 0x1000 ...

وتحرير: أود أن أشير أيضا إلى أن عادة عند كتابة السلاسل DMA كنت تكتب لهم من خلال الذاكرة غير المخبأة أو عن طريق نوع من طابور الكتابة غير مخبأ القائم. إذا كان هذا هو حال كنت ترغب في محاذاة سلاسل DMA لحجم خط التخزين المؤقت بالإضافة إلى منع التخزين المؤقت للكتابة لإعادة الكتابة بداية أو نهاية سلسلة DMA الخاصة بك.

نصائح أخرى

وكما أشار جوز، ولكن (IMO) قليلا أقل وضوحا: كنت طالبا للمحاذاة من 0x1000 بايت (الوسيطة الثانية)، والتي هي أكثر بكثير من 64 بت

.

هل يمكن تغيير المكالمة للتو:

posix_memalign ((void**)&pPattern, 8, DmaBufferSizeinInt32s * sizeof(int)))

وهذا قد إجراء المكالمة أرخص (ذاكرة أقل يضيع)، وعلى أي حال هو أكثر وضوحا، منذ أن تسأل عن شيء يطابق عن كثب ما تريد فعلا.

لا أعرف أجهزتك ولا أعرف كيف تحصل على مؤشر pPattern الخاص بك، لكن هذا يبدو محفوفًا بالمخاطر في كل مكان.تتطلب معظم DMA التي أعرفها ذاكرة الوصول العشوائي الفعلية المستمرة.يوفر نظام التشغيل ذاكرة الوصول العشوائي (RAM) المستمرة تقريبًا لبرامج المستخدم فقط.وهذا يعني أن تخصيص ذاكرة يبلغ 1 ميجابايت قد يتكون من ما يصل إلى 256 صفحة غير متصلة بذاكرة الوصول العشوائي (RAM) بدقة 4K.

في معظم الأوقات، سيتم إجراء عمليات تخصيص الذاكرة من أجزاء مادية مستمرة يمكن أن تؤدي إلى عمل الأشياء في معظم الأوقات ولكن ليس دائمًا.أنت بحاجة إلى برنامج تشغيل جهاز kernel لتوفير DMA آمن.

أتساءل عن هذا لأنه إذا كان مؤشر pPattern الخاص بك يكون قادمة من برنامج تشغيل الجهاز، فلماذا تحتاج إلى محاذاته أكثر؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top