320 likes | 562 Views
מערכות הפעלה. תרגול 8 – ניהול פסיקות. מה בתכנית?. תזכורת - ניהול פסיקות ניהול פסיקות ב- XINU. תזכורת – מהי פסיקה?. מצב של העברת שליטה בכפייה של ה- CPU לרוטינה. פסיקות נבדלות לכמה סוגים:
E N D
מערכות הפעלה תרגול8 – ניהול פסיקות
מה בתכנית? • תזכורת - ניהול פסיקות • ניהול פסיקות ב-XINU מערכות הפעלה - תרגול 9
תזכורת – מהי פסיקה? • מצב של העברת שליטה בכפייה של ה-CPU לרוטינה. • פסיקות נבדלות לכמה סוגים: • 1. Hardware Interrupts – פסיקות חומרה – תגובה לאיתותי חומרה במחשב שמחוץ ל-CPU. בד"כ לצרכי קלט\פלט. • 2. Exceptions – חריגות – פסיקות הנובעות ממצב לא תקין במהלך הריצה. • 3. Software Interrupts – פסיקות תוכנה – פסיקות ביוזמת התוכנית מערכות הפעלה - תרגול 2
תזכורת - וקטור הפסיקות • טיפול בפסיקה מתבצע באמצעות הרצת שגרה מיוחדת האחראית לטפל באותה פסיקה. לשגרה כזאת קוראים ISR – Interrupt Service Routine • למבנה נתונים המקשר בין כל מספר פסיקה לשגרת הטיפול בה קוראים וקטור פסיקות • כתובת שגרת ISR: 4 בתים (2 סגמנט, 2 אופסט) • K1 בזכרון לשמירת כל הכתובות (=1024 בתים) • הפסיקות המזוהות ע"י מס' FF..0. כשמגיעה פסיקה מס' v , מריצים את שגרת הטיפול הנמצאת בזכרון בכתובת 4v. מערכות הפעלה - תרגול 2
חריגות • חריגות (למשל חלוק באפס, גישה לזכרון לא קיים, נפילת מתח) מטופלות כפסיקות. • דוגמאות: • כניסה 0 בוקטור הפסיקות שמורה לחריגה – חילוק באפס • כניסה 4 שמורה עבור גלישה (overflow) מערכות הפעלה - תרגול 2
פסיקות תכנה • ניתן "לייצר" פסיקות באמצעות פקודת האסמבלר int. פסיקות אלו נקראות פסיקות תכנה • תחביר: int <מספר פסיקה>; • דוגמה: פסיקת breakpoint int 3; מערכות הפעלה - תרגול 2
סוגי פסיקות ב-XINU מערכות הפעלה - תרגול 2
מנגנון הפסיקות • סיום הפקודה הנוכחית. • שמירת אוגר הדגלים. • איפוס Interrupt Flag – IF. • איפוס Trap Flag – TF. • שמירת כתובת הפקודה הבאה לביצוע cs:ip. • שימוש בפקודת IRET במקום RET: חזור מטיפול בפסיקה – שולפת מהמחסנית את ה-FLAGS, cs, ip ושינוי cs:ip לערכים שנשלפו מהמחסנית. מערכות הפעלה - תרגול 9
מימוש פסיקות - דרישות • אין קריאה מסודרת לפונקציות טיפול בפסיקה. הפסיקה קוראת "בין" שורות הקוד של התוכנית. • יש צורך לשמור את ה-FLAGS וכתובת החזרה CS:IP • יש צורך בפקודה מיוחדת כדי להוציא את ה- CS:IP הישנים שנשמרו ואת ה-FLAGS. • לא ניתן לממש שגרת טיפול בפסיקה בשפת C • אבל... נרצה קוד כמה שיותר פשוט מערכות הפעלה - תרגול 9
פתרון: אסטרטגית פסיקות ב-XINU • אסטרטגיית שני שלבים: • פסיקות מועברות לשגרה קטנה הכתובה בשפת אסמבלר שאחראית על טיפול בערכי אוגרים, זיהוי ההתקן שגרם לפסיקה, וחזרה מפסיקה • בנוסף השגרה גם קוראת לפונקצית טיפול ראשית עבור אותו התקן שכתובה ב-C מערכות הפעלה - תרגול 9
Interrupt Dispatcher • משתמש בטבלת הפסיקות intmapשכוללת פניות לשגרתintcom דרך פקודת CALL. • כאשר קוראת פסיקה, המעבד מייד מבצע את פקודת ה- CALL ל-intcom שבעקבותיה מתבצע הקוד של intcom. • אם כל הפסיקות משתמשות באותה שגרה, כיצד יש הבחנה בינהן? • פקודת CALL דוחפת כתובת חזרה למחסנית,כלומר, את ה-byte שאחרי הפקודה. לכן, intcom יכולה להשתמש בכתובת הזו כפויננטר לטבלת intmap. מערכות הפעלה - תרגול 9
מבנה הנתונים - Intmap מערכות הפעלה - תרגול 9
מבנה הנתונים - Intmap מערכות הפעלה - תרגול 9
Interrupt Dispatcher – אופן טיפול בפסיקה • 1. Intcom יכולה לבצע שגרת BIOS לפני טיפול בפסיקה. זה נועד להתמודד עם הצורך להריץ קוד התלוי בחומרה. • 2. קריאה לקוד הייחודי של XINU לפסיקה. • Reentancy Problem: אם הפסיקה התרחשה במהלך קריאת Bios עלולה להיות בעיה. קריאות BIOS מאפשרות פסיקות, ולא יכולות להגן על המשתנים הגלובליים שלהם מפני קריאות חוזרות מתהליכים שונים (non-reentrant). מערכות הפעלה - תרגול 9
אופן טיפול בפסיקה - המשך • מה עלול לקרות? ישנן פסיקות (רוטינות של XINU) שקוראות ל- resched. אם התהליך מתחלף זה יכול לגרום לפסיקת BIOS נוספת • פתרון: ביטול החלפת תהליכים במידה והפסיקה התרחשה במהלך קריאת Bios – כיבוי .pcxflag • עניין נוסף: פסיקות שמתרחשות במהלך קריאת Bios ימתמשו בסגמנטי קוד ומידע השונים מזה ש-XINU משתמשת (כך גם נדע להבחין שאנו במהלך קריאת Bios). • לכן, קוד הפסיקה של XINU חייב להיקרא עם סגמנטים תואמים ל-XINU – באחריות intcom ליצור מחסנית זמנית בסגמנט המידע של XINU. מערכות הפעלה - תרגול 9
עיבוד פסיקה עם pcxflag מכובה • דגל pcxflag שולט ב-resched • pcxflag = 0 כשהמחסנית הלוקלית משמשת לקריאות BIOS • xdisable/xrestore שולטות על הדגל • שדה iflag בכניסת intmap אומר האם לבצע קריאה לשגרה המקורית לפני קריאה לשגרת XINU מערכות הפעלה - תרגול 9
עיבוד פסיקה עם pcxflag דלוק • האם ניתן לעשות resched? כן, בתנאי שלא מתבצעת קריאה לשגרת BIOS • נראה תרשים שמציג למה זה בטוח עבור שני תהליכים, P ו-Q P Intcom (1) ISR Q Intcom (2) … איך נמנע "stack overflow"? Resched מערכות הפעלה - תרגול 9
עיבוד פסיקה עם pcxflag דלוק • לכל תהליך יש מחסנית משלו • רק פסיקה אחת מתבצעת עבור אותו תהליך • כשהתהליך חוזר למעבד הפסיקות שוב מכובות עד לחזרה מהפסיקה המקורית • פסיקה נוספת לא תופיע בזמן ריצה של פסיקה בהקשר של P • פסיקה אכן יכולה להופיע בזמן ריצה של Q מערכות הפעלה - תרגול 9
עיבוד פסיקה עם pcxflag דלוק • resched בזמן עיבוד פסיקה הוא בטוח אם: • ISR מעדכן את כל הנתונים הגלובליים לפני קריאה ל-resched • אף שגרה לא מתירה פסיקות בלי שאסרה אותן לפני זה • היוצא מן הכלל – מהלך העדכון שמתיר את הפסיקות בעליית המערכת מערכות הפעלה - תרגול 9
כללים לכתיבת ISR • לא מרימה דגל של פסיקות בצורה מפורשת • יכולה לבצע resched(בודקת את תקינות המבנים הגלובליים לפני הקריאה) • לא קוראת לפונקציה שמעבירה את התהליך למצב שונה מ-CURR ו-READY (תהליך NULL) • לא משאירה פסיקות מכובות הרבה זמן – ההתקנים חייבים לפעול נכון • זמן העיקוב האפשרי הוא תלוי התקן מערכות הפעלה - תרגול 9
דוגמא: הדפס את מספר הפעמים שבו פסיקת XINU נתונה הופיעה • רעיון: נוסיף שדה חדש ל-intmap- countint. • בפונקציית intcom נעלה את ה-counter ב-1 • נכתוב קריאות מערכת int return_interrupt_int_no_of_times(int int_no) void int_used_by_xinu() כך שהפונקציה return_interrupt_int_no_of_times תחזיר את מספר הפעמים שבה הפסיקה מספר int_no הופיעה, והפונקציה int_used_by_xinu תדפיס את כל הפסיקות שמטופלות על ידי XINU. מערכות הפעלה - תרגול 9