לדלג לתוכן

פתרון מיפוי ונגיעה בעמודים

הקטע הבא מתווסף לפני לולאת הכתיבה בהרצאה. הוא קורא בייט מכל עמוד ושומר את התוצאה לצורך אבחון.

let mut observed = 0u64;
for offset in (0..len).step_by(page) {
    observed += u64::from(unsafe { raw.cast::<u8>().add(offset).read_volatile() });
}
println!("sum={observed}");
pause("one read per page")?;

הקריאה יכולה להסתמך על מנגנוני אפס משותפים או על מדיניות המיפוי של המערכת, בעוד שכתיבה דורשת עמוד שניתן לשנות עבור התהליך. אין להבטיח מספר fault מדויק בלי לציין מערכת וקונפיגורציה, משום שגודל עמודים ומדיניות הקצאה יכולים להשפיע.

פגיעת TLB אינה צריכה הליכה בטבלאות. החטאה עם תרגום תקף יכולה להיפתר בחומרה, ו־fault מפעיל קוד קרנל מתאים. גם ב־fault אין חובה עקרונית להחליף משימה, אבל אם הטיפול דורש המתנה לקלט ופלט ייתכן שהתהליך ייחסם וה־scheduler יריץ עבודה אחרת.