פתרון גישה לחומרה ובחירת מודל¶
הכתובת ברשימת המשאבים אינה pointer של C++. לאחר בחירת descriptor מתאים, המיפוי מחזיר כתובת וירטואלית שבה ה־CPU יכול להשתמש לפי חוזי ה־DDI. כתובת DMA נוצרת במסלול אחר עבור ההתקן, ויכולה לעבור תרגום של IOMMU.
מסלול rollback צריך לשחרר רק משאבים שכבר נוצרו. אפשר לאתחל את כל שדות המיפוי ל־nullptr ואורך אפס, ולעדכן כל זוג רק לאחר הצלחה. בעת כשל משחררים את המיפויים הקודמים בסדר שמבטיח שאין משתמש פעיל, ומאפסים את השדות כדי שלא ישוחררו שוב.
חוזה של התקן מסוים¶
בדיקת אורך מינימלי מגינה מפני גישה מעבר למשאב, אבל אינה מוכיחה ש־offset מסוים הוא רגיסטר נכון. צריך לדעת איזה BAR או descriptor מייצג את הבלוק, אילו רוחבים מותרים ומהן תופעות הלוואי של קריאה וכתיבה.
מדיניות cache נבחרת לפי סוג הזיכרון ותיעוד המערכת וההתקן. אין להשתמש ב־PAGE_NOCACHE כפתרון אוניברסלי לכל אזור, ואין למפות אותו טווח שוב עם מאפיינים סותרים מתוך תקווה שהמערכת תפתור זאת.
חיי DMA¶
ה־buffer נשאר חי ונגיש להתקן כל עוד transaction פעילה. בקשת ביטול משנה את התוכנית, אך אינה בהכרח עוצרת מיד bus mastering. רק אחרי פרוטוקול עצירה או completion שמוכיח שההתקן סיים, אפשר לשחרר את המיפוי ואת האחסון.
ב־surprise removal צריך לפעול לפי חוזי ה־bus וה־framework, בלי לנסות להמתין לרגיסטר שהתקן שנעלם לא יענה עליו. המנגנון המדויק תלוי בחומרה, ולכן פתרון שמבוסס על לולאת polling כללית אינו מספיק.
בחירת מודל¶
אם class driver קיים כבר מספק את הפונקציונליות, driver חדש יכול להוסיף מורכבות וסיכון בלי ערך. אם UMDF תומך בדרישות, בידוד ב־user mode יכול להפוך כשל מקומי לפשוט יותר להתאוששות. דרישה אמיתית ל־DDI או להקשר שאינו זמין שם יכולה להצדיק KMDF.
הדוח צריך להבחין בין עובדה מתועדת לבין השערה על latency או throughput. בחירת קרנל אינה הוכחה לביצועים, ובחירת user mode אינה הוכחה אוטומטית שהמערכת בטוחה.