מערכות הפעלה

Download Report

Transcript מערכות הפעלה

‫מערכות הפעלה‬
‫תרגול ‪ – 8‬ניהול פסיקות‬
‫מה בתכנית?‬
‫‪ ‬תזכורת ‪ -‬ניהול פסיקות‬
‫‪ ‬ניהול פסיקות ב‪XINU-‬‬
‫‪2‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫תזכורת – מהי פסיקה?‬
‫‪‬‬
‫‪‬‬
‫מצב של העברת שליטה בכפייה של ה‪ CPU-‬לרוטינה‪.‬‬
‫פסיקות נבדלות לכמה סוגים‪:‬‬
‫‪ – Hardware Interrupts .1‬פסיקות חומרה – תגובה‬
‫לאיתותי חומרה במחשב שמחוץ ל‪ .CPU-‬בד"כ לצרכי‬
‫קלט\פלט‪.‬‬
‫‪ – Exceptions .2‬חריגות – פסיקות הנובעות ממצב לא תקין‬
‫במהלך הריצה‪.‬‬
‫‪ – Software Interrupts .3‬פסיקות תוכנה – פסיקות ביוזמת‬
‫התוכנית‬
‫‪3‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫אפריל ‪15‬‬
‫תזכורת ‪ -‬וקטור הפסיקות‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫טיפול בפסיקה מתבצע באמצעות הרצת שגרה מיוחדת‬
‫האחראית לטפל באותה פסיקה‪ .‬לשגרה כזאת קוראים ‪ISR‬‬
‫– ‪Interrupt Service Routine‬‬
‫למבנה נתונים המקשר בין כל מספר פסיקה לשגרת הטיפול‬
‫בה קוראים וקטור פסיקות‬
‫כתובת שגרת ‪ 4 :ISR‬בתים (‪ 2‬סגמנט‪ 2 ,‬אופסט)‬
‫‪ 1K‬בזכרון לשמירת כל הכתובות (=‪ 1024‬בתים)‬
‫הפסיקות המזוהות ע"י מס' ‪ .0..FF‬כשמגיעה פסיקה מס' ‪, v‬‬
‫מריצים את שגרת הטיפול הנמצאת בזכרון בכתובת ‪.4v‬‬
‫‪4‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫אפריל ‪15‬‬
‫חריגות‬
‫‪‬‬
‫חריגות (למשל חלוק באפס‪ ,‬גישה לזכרון לא קיים‪ ,‬נפילת‬
‫מתח) מטופלות כפסיקות‪.‬‬
‫‪‬‬
‫דוגמאות‪:‬‬
‫‪ ‬כניסה ‪ 0‬בוקטור הפסיקות שמורה לחריגה – חילוק באפס‬
‫‪ ‬כניסה ‪ 4‬שמורה עבור גלישה (‪)overflow‬‬
‫‪5‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫אפריל ‪15‬‬
‫פסיקות תכנה‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫ניתן "לייצר" פסיקות באמצעות פקודת האסמבלר ‪.int‬‬
‫פסיקות אלו נקראות פסיקות תכנה‬
‫תחביר‪:‬‬
‫;>מספר פסיקה< ‪int‬‬
‫דוגמה‪ :‬פסיקת ‪breakpoint‬‬
‫;‪int 3‬‬
‫‪6‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫אפריל ‪15‬‬
‫סוגי פסיקות ב‪XINU-‬‬
‫‪7‬‬
‫מספר‬
‫סוג‬
‫‪00‬‬
‫חריגה‬
‫תאור‬
‫שם‬
‫חילוק באפס‬
‫‪08‬‬
‫חומרה‬
‫‪CLK_INT‬‬
‫פסיקת שעון (כ‪ 18.2‬פעמים בשנייה)‬
‫‪09‬‬
‫חומרה‬
‫‪KBD_INT‬‬
‫לחיצה על מקלדת‬
‫‪10‬‬
‫תוכנה‬
‫‪VID‬‬
‫שרותי תצוגת מסך‬
‫‪13‬‬
‫תוכנה‬
‫‪DSK‬‬
‫שרותי דיסק‬
‫‪16‬‬
‫תוכנה‬
‫‪KBD‬‬
‫שרותי קלט מהמקלדת‬
‫‪18‬‬
‫תוכנה‬
‫‪Ctrl_Break‬‬
‫נקראת ב‪Ctrl-Break-‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪2‬‬
‫אפריל ‪15‬‬
‫מנגנון הפסיקות‬
‫‪‬‬
‫סיום הפקודה הנוכחית‪.‬‬
‫שמירת אוגר הדגלים‪.‬‬
‫איפוס ‪.Interrupt Flag – IF‬‬
‫איפוס ‪.Trap Flag – TF‬‬
‫שמירת כתובת הפקודה הבאה‬
‫לביצוע ‪.cs:ip‬‬
‫‪‬‬
‫שימוש בפקודת ‪ IRET‬במקום ‪ :RET‬חזור מטיפול‬
‫בפסיקה – שולפת מהמחסנית את ה‪ip ,cs ,FLAGS-‬‬
‫ושינוי ‪ cs:ip‬לערכים שנשלפו מהמחסנית‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪8‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫מימוש פסיקות ‪ -‬דרישות‬
‫‪‬‬
‫אין קריאה מסודרת לפונקציות טיפול בפסיקה‪ .‬הפסיקה‬
‫קוראת "בין" שורות הקוד של התוכנית‪.‬‬
‫יש צורך לשמור את ה‪ FLAGS-‬וכתובת החזרה ‪CS:IP‬‬
‫יש צורך בפקודה מיוחדת כדי להוציא את ה‪CS:IP-‬‬
‫הישנים שנשמרו ואת ה‪.FLAGS-‬‬
‫‪‬‬
‫לא ניתן לממש שגרת טיפול בפסיקה בשפת ‪C‬‬
‫אבל‪ ...‬נרצה קוד כמה שיותר פשוט‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪9‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫פתרון‪ :‬אסטרטגית פסיקות ב‪XINU-‬‬
‫‪ ‬אסטרטגיית שני שלבים‪:‬‬
‫‪ ‬פסיקות מועברות לשגרה קטנה הכתובה בשפת‬
‫אסמבלר שאחראית על טיפול בערכי אוגרים‪ ,‬זיהוי‬
‫ההתקן שגרם לפסיקה‪ ,‬וחזרה מפסיקה‬
‫‪ ‬בנוסף השגרה גם קוראת לפונקצית טיפול ראשית‬
‫עבור אותו התקן שכתובה ב‪C-‬‬
‫‪10‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪Interrupt Dispatcher‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪11‬‬
‫משתמש בטבלת הפסיקות ‪ intmap‬שכוללת פניות‬
‫לשגרת ‪ intcom‬דרך פקודת ‪.CALL‬‬
‫כאשר קוראת פסיקה‪ ,‬המעבד מייד מבצע את פקודת‬
‫ה‪ CALL -‬ל‪ intcom-‬שבעקבותיה מתבצע הקוד של‬
‫‪.intcom‬‬
‫אם כל הפסיקות משתמשות באותה שגרה‪ ,‬כיצד יש‬
‫הבחנה בינהן?‬
‫פקודת ‪ CALL‬דוחפת כתובת חזרה למחסנית‪,‬כלומר‪,‬‬
‫את ה‪ byte-‬שאחרי הפקודה‪ .‬לכן‪ intcom ,‬יכולה‬
‫להשתמש בכתובת הזו כפויננטר לטבלת ‪.intmap‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫מבנה הנתונים ‪Intmap -‬‬
‫‪12‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫מבנה הנתונים ‪Intmap -‬‬
‫‪13‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪ – Interrupt Dispatcher‬אופן טיפול בפסיקה‬
‫‪ Intcom .1‬יכולה לבצע שגרת ‪ BIOS‬לפני טיפול‬
‫בפסיקה‪ .‬זה נועד להתמודד עם הצורך להריץ קוד‬
‫התלוי בחומרה‪.‬‬
‫‪ .2‬קריאה לקוד הייחודי של ‪ XINU‬לפסיקה‪.‬‬
‫‪ :Reentancy Problem ‬אם הפסיקה התרחשה‬
‫במהלך קריאת ‪ Bios‬עלולה להיות בעיה‪ .‬קריאות‬
‫‪ BIOS‬מאפשרות פסיקות‪ ,‬ולא יכולות להגן על‬
‫המשתנים הגלובליים שלהם מפני קריאות חוזרות‬
‫מתהליכים שונים )‪.(non-reentrant‬‬
‫‪14‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫אופן טיפול בפסיקה ‪ -‬המשך‬
‫מה עלול לקרות? ישנן פסיקות (רוטינות של ‪)XINU‬‬
‫שקוראות ל‪ .resched -‬אם התהליך מתחלף זה יכול לגרום‬
‫לפסיקת ‪ BIOS‬נוספת‬
‫‪ ‬פתרון‪ :‬ביטול החלפת תהליכים במידה והפסיקה התרחשה‬
‫במהלך קריאת ‪ – Bios‬כיבוי ‪.pcxflag‬‬
‫‪ ‬עניין נוסף‪ :‬פסיקות שמתרחשות במהלך קריאת ‪Bios‬‬
‫ימתמשו בסגמנטי קוד ומידע השונים מזה ש‪XINU-‬‬
‫משתמשת (כך גם נדע להבחין שאנו במהלך קריאת ‪.)Bios‬‬
‫לכן‪ ,‬קוד הפסיקה של ‪ XINU‬חייב להיקרא עם סגמנטים‬
‫תואמים ל‪ – XINU-‬באחריות ‪ intcom‬ליצור מחסנית זמנית‬
‫בסגמנט המידע של ‪.XINU‬‬
‫‪15‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪16‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪17‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪18‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪19‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬מכובה‬
‫‪ ‬דגל ‪ pcxflag‬שולט ב‪resched-‬‬
‫‪ pcxflag = 0 ‬כשהמחסנית הלוקלית משמשת‬
‫לקריאות ‪BIOS‬‬
‫‪ xdisable/xrestore ‬שולטות על הדגל‬
‫‪ ‬שדה ‪ iflag‬בכניסת ‪ intmap‬אומר האם לבצע‬
‫קריאה לשגרה המקורית לפני קריאה לשגרת‬
‫‪XINU‬‬
‫‪20‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪ ‬האם ניתן לעשות ‪ ?resched‬כן‪ ,‬בתנאי שלא‬
‫מתבצעת קריאה לשגרת ‪BIOS‬‬
‫‪ ‬נראה תרשים שמציג למה זה בטוח עבור שני‬
‫תהליכים‪ P ,‬ו‪Q-‬‬
‫…‬
‫)‪Intcom (2‬‬
‫איך נמנע " ‪stack‬‬
‫‪?"overflow‬‬
‫‪21‬‬
‫‪Q‬‬
‫‪ISR‬‬
‫)‪Intcom (1‬‬
‫‪P‬‬
‫‪Resched‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪ ‬לכל תהליך יש מחסנית משלו‬
‫‪ ‬רק פסיקה אחת מתבצעת עבור אותו תהליך‬
‫‪ ‬כשהתהליך חוזר למעבד הפסיקות שוב מכובות עד‬
‫לחזרה מהפסיקה המקורית‬
‫‪ ‬פסיקה נוספת לא תופיע בזמן ריצה של פסיקה‬
‫בהקשר של ‪P‬‬
‫‪ ‬פסיקה אכן יכולה להופיע בזמן ריצה של ‪Q‬‬
‫‪22‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪ resched ‬בזמן עיבוד פסיקה הוא בטוח אם‪:‬‬
‫‪ ISR ‬מעדכן את כל הנתונים הגלובליים לפני קריאה‬
‫ל‪resched-‬‬
‫‪ ‬אף שגרה לא מתירה פסיקות בלי שאסרה אותן‬
‫לפני זה‬
‫‪ ‬היוצא מן הכלל – מהלך העדכון שמתיר את‬
‫הפסיקות בעליית המערכת‬
‫‪23‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫כללים לכתיבת ‪ISR‬‬
‫‪ ‬לא מרימה דגל של פסיקות בצורה מפורשת‬
‫‪ ‬יכולה לבצע ‪( resched‬בודקת את תקינות המבנים‬
‫הגלובליים לפני הקריאה)‬
‫‪ ‬לא קוראת לפונקציה שמעבירה את התהליך למצב‬
‫שונה מ‪ CURR-‬ו‪( READY-‬תהליך ‪)NULL‬‬
‫‪ ‬לא משאירה פסיקות מכובות הרבה זמן –‬
‫ההתקנים חייבים לפעול נכון‬
‫‪ ‬זמן העיקוב האפשרי הוא תלוי התקן‬
‫‪24‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫דוגמא‪ :‬הדפס את מספר הפעמים שבו‬
‫פסיקת ‪ XINU‬נתונה הופיעה‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫רעיון‪ :‬נוסיף שדה חדש ל‪.countint -intmap-‬‬
‫בפונקציית ‪ 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‬‬
‫‪25‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪26‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪27‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪28‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪29‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪30‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬
‫‪31‬‬
‫מערכות הפעלה ‪ -‬תרגול ‪9‬‬
‫אפריל ‪15‬‬