Reentrant code והימנעות מהחלפת תהליכים
נאמר שפונקציה היא
reentrant אם מספר קריאות
לפונקציה ממספר תהליכים יכולים לבצע את הקוד שלה בו זמנית. מערכות הפעלה המנהלות מספר תהליכים בו
זמנית מלאות בפונקציות מסוג reentrant, למשל, ב-XINU resched היא
פונקציה כזו. שגרות reentrant לרוב משתמשים במשתנים מקומיים המוקצים על מחסנית המשתמש. גישות למשתנים גלובליים נעשים על ידי פונקציות
כאלו מתוך קטעים העטופים ב-disable/restore.
שגרות BIOS אינן reentrent. מכיוון שקריאות לשגרות BIOS לעיתים רבות מפעילות שוב את הפסיקות, הן אינן יכולות לסמוך על עצמן שהן יהיו
מסוגלות להגן על המשתנים הגלובליים שלהן במידה ואותה פסיקה תתרחש ממספר תהליכים. ב-XINU פונקציה אחת בלבד אחראית על החלפת התהליכים - resched.
הדרך היחידה ש-resched יכולה להיקרא מתוך שיגרת BIOS היא עקב פסיקות.
כמו כן, ב-XINU הפונקציה intcom מקצה
מחסנית מקומית בה שגרת ה-BIOS שומרות את הנתונים שלהן.
לפיכך - אסור להחליף תהליכים כאשר אנו בזמן פסיקות BIOS.
המשתנה pcxflag משמש כעוצר החלפת התהליכים. כאשר הדגל קבוע ל-0, החלפת התהליכים של XINU מבוטלת. כאשר המשתנה הוא 1, החלפת התהליכים נעשית כרגיל.
לפיכך intcom קובעת דגל זה ל-0 כאשר המחסנית המקומית משמשת פסיקת BIOS.
תודה
הסברתם את זה, כמו שאר הנושאים, באופן הכי ברור שיש.