מערכות הפעלה

‫מערכות הפעלה‬
‫תרגול ‪ – 7‬ניהול פסיקות‪ ,‬קלט‪/‬פלט‬
‫‪xfork‬‬
‫‪‬‬
‫חיקוי ‪ XINU‬לקריאת ‪fork‬‬
‫‪ ‬מייצרים תהליך חדש עבור תהליך הבן‬
‫‪ ‬מעתיקים תוכן המחסנית מתהליך האב אל תהליך הבן‬
‫‪ ‬מחשבים מצביע הקוד עבור תהליך הבן‬
‫‪ ‬מסמלצים קריאה ל‪ctxsw-‬‬
‫‪ ‬מחזירים ‪ pid‬של תהליך חדש לאב או ‪ 0‬לבן‬
‫‪2‬‬
‫מאי ‪10‬‬
‫‪ – retip‬חישוב כתובת חזרה‬
‫‪3‬‬
‫מאי ‪10‬‬
xfork
10 ‫מאי‬
4
‫‪xfork‬‬
‫הכנת‬
‫מחסנית‬
‫עדכון ‪bp‬‬
‫עבור ‪xmain‬‬
‫הרצת‬
‫תהליך הבן‬
‫‪5‬‬
‫מאי ‪10‬‬
‫שאלות שצריך לשאול‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪6‬‬
‫האם צריך ליצור תהליך חדש עם ‪ pid‬חדש או‬
‫מספיק לשנות תהליך קיים?‬
‫האם צריך להקצות מחסנית נוספת?‬
‫מה המחסנית אמורה להכיל?‬
‫איך התהליך יחזור מהקריאה?‬
‫האם דרושים משתנים נוספים כדי לבצע את‬
‫המשימה?‬
‫מאי ‪10‬‬
‫פסיקות ב‪XINU-‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪7‬‬
‫לא ניתן לממש שגרת טיפול בפסיקה בשפת ‪C‬‬
‫אסטרטגיית שני שלבים‪:‬‬
‫פסיקות מועברות לשגרה קטנה הכתובה בשפת‬
‫אסמבלר שאחראית על טיפול בערכי אוגרים‪ ,‬זיהוי‬
‫ההתקן שגרם לפסיקה‪ ,‬וחזרה מפסיקה‬
‫בנוסף השגרה גם קוראת לפונקצית טיפול ראשית‬
‫עבור אותו התקן שכתובה ב‪C-‬‬
‫מאי ‪10‬‬
‫)‪Interrupt Dispatcher (io.h‬‬
‫‪‬‬
‫‪8‬‬
‫משתמש בטבלת הפסיקות ‪ intmap‬שכוללת פניות‬
‫לשגרת‪:‬‬
‫מאי ‪10‬‬
Interrupt Dispatcher (intcom.asm)
:‫הגדרת הטבלה באסמבלי‬
10 ‫מאי‬

9
‫‪intcom‬‬
‫‪‬‬
‫‪ – intcom‬יכולה לבצע שגרת ‪ BIOS‬לפני טיפול בפסיקה‬
‫קריאה ל‪?BIOS-‬‬
‫‪iflag != 0‬‬
‫כן‬
‫קריאה ל‪BIOS-‬‬
‫לא‬
‫השבת החלפת תהליכים‬
‫מחסנית ‪CS != CS‬‬
‫כן‬
‫‪pcxflag = 0‬‬
‫האם פסיקה התבצעה בזמן‬
‫ריצה של רוטינה מחוץ ל‪-‬‬
‫‪?)BIOS, DOS( XINU‬‬
‫לא‬
‫קרא ל‪ISR XINU-‬‬
‫קרא ל‪ISR XINU-‬‬
‫שחזר ‪pcxflag‬‬
‫חזור מפסיקה (‪)IRET‬‬
‫‪10‬‬
‫מאי ‪10‬‬
‫‪Interrupt Dispatcher‬‬
‫‪ – intcom ‬יכולה לבצע שגרת ‪ BIOS‬לפני טיפול‬
‫בפסיקה‬
‫‪ ‬קריאות ‪ BIOS‬מאפשרות פסיקות‪ ,‬ולא יכולות להגן‬
‫על המשתנים הגלובליים שלהם מפני קריאות‬
‫חוזרות מתהליכים שונים )‪ – (non-reentrant‬יש‬
‫צורך לבטל החלפת תהליכים‬
‫‪ ‬אם התהליך מתחלף זה יכול לגרום לפסיקת ‪BIOS‬‬
‫נוספת‬
‫‪11‬‬
‫מאי ‪10‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬מכובה‬
‫‪ ‬דגל ‪ pcxflag‬שולט ב‪resched-‬‬
‫‪ pcxflag = 0 ‬כשהמחסנית הלוקלית משמשת‬
‫לקריאות ‪BIOS‬‬
‫‪ xdisable/xrestore ‬שולטות על הדגל‬
‫‪ ‬שדה ‪ iflag‬בכניסת ‪ intmap‬אומר האם לבצע‬
‫קריאה לשגרה המקורית לפני קריאה לשגרת‬
‫‪XINU‬‬
‫‪12‬‬
‫מאי ‪10‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪ ‬האם ניתן לעשות ‪ ?resched‬כן‪ ,‬בתנאי שלא‬
‫מתבצעת קריאה לשגרת ‪BIOS‬‬
‫‪ ‬נראה תרשים שמציג למה זה בטוח עבור שני‬
‫תהליכים‪ P ,‬ו‪Q-‬‬
‫…‬
‫)‪Intcom (2‬‬
‫איך נמנע " ‪stack‬‬
‫‪?"overflow‬‬
‫‪13‬‬
‫‪Q‬‬
‫‪ISR‬‬
‫)‪Intcom (1‬‬
‫‪P‬‬
‫‪Resched‬‬
‫מאי ‪10‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪14‬‬
‫לכל תהליך יש מחסנית משלו‬
‫רק פסיקה אחת מתבצעת עבור אותו תהליך‬
‫כשהתהליך חוזר למעבד הפסיקות שוב מכובות עד‬
‫לחזרה מהפסיקה המקורית‬
‫פסיקה נוספת לא תופיע בזמן ריצה של פסיקה‬
‫בהקשר של ‪P‬‬
‫פסיקה אכן יכולה להופיע בזמן ריצה של ‪Q‬‬
‫מאי ‪10‬‬
‫עיבוד פסיקה עם ‪ pcxflag‬דלוק‬
‫‪ resched ‬בזמן עיבוד פסיקה הוא בטוח אם‪:‬‬
‫‪ ISR ‬מעדכן את כל הנתונים הגלובליים לפני קריאה‬
‫ל‪resched-‬‬
‫‪ ‬אף שגרה לא מתירה פסיקות בלי שאסרה אותן‬
‫לפני זה‬
‫‪ ‬היוצא מן הכלל – מהלך העדכון שמתיר את‬
‫הפסיקות בעליית המערכת‬
‫‪15‬‬
‫מאי ‪10‬‬
‫כללים לכתיבת ‪ISR‬‬
‫‪ ‬לא מרימה דגל של פסיקות בצורה מפורשת‬
‫‪ ‬יכולה לבצע ‪( resched‬בודקת את תקינות המבנים‬
‫הגלובליים לפני הקריאה)‬
‫‪ ‬לא קוראת לפונקציה שמעבירה את התהליך למצב‬
‫שונה מ‪ CURR-‬ו‪READY-‬‬
‫‪ ‬לא משאירה פסיקות מכובות הרבה זמן –‬
‫ההתקנים חייבים לפעול נכון‬
‫‪ ‬זמן העיקוב האפשרי הוא תלוי התקן‬
‫‪16‬‬
‫מאי ‪10‬‬
‫דוגמה – הרחבת שגרת הפסיקה‬
‫‪ ‬לא מרימה דגל של פסיקות בצורה מפורשת‬
‫‪ ‬יכולה לבצע ‪( resched‬בודקת את תקינות המבנים‬
‫הגלובליים לפני הקריאה)‬
‫‪ ‬לא קוראת לפונקציה שמעבירה את התהליך למצב‬
‫שונה מ‪ CURR-‬ו‪READY-‬‬
‫‪ ‬לא משאירה פסיקות מכובות הרבה זמן –‬
‫ההתקנים חייבים לפעול נכון‬
‫‪ ‬זמן העיקוב האפשרי הוא תלוי התקן‬
‫‪17‬‬
‫מאי ‪10‬‬
‫קלט‪/‬פלט ב‪XINU-‬‬
‫‪18‬‬
‫מאי ‪10‬‬
‫קלט‪/‬פלט ברמת המכונה‬
‫שיטות קלט‪/‬פלט‪:‬‬
‫‪ ‬קלט‪/‬פלט דרך ‪ports‬‬
‫‪( Memory Mapped I/O ‬קלט‪/‬פלט ממופה‬
‫לכתובות)‬
‫‪ ‬משולבת‪)DMA( Direct Memory Access :‬‬
‫‪19‬‬
‫מאי ‪10‬‬
‫קלט‪/‬פלט דרך ‪ports‬‬
‫‪ ‬מרחב כתובות נפרד מהזיכרון‬
‫‪ ports ‬מייצגים מעין ערוצים עם ‪ 2‬קצוות‪ :‬במעבד‬
‫ובהתקן (בדרך כלל ‪ chip‬אחר)‬
‫‪ ‬מרחב כתובות – ‪ 0‬עד ‪( 65535‬רובם לא בשימוש)‬
‫‪ ‬החיבור הוא בחומרה‪ ,‬ומספרו ידוע למעבד‬
‫‪ ‬ישנם גם חיבורים שלא למעבד‪ ,‬הם לא נגישים‬
‫מקוד אסמבלר ומספרם אינו ידוע‬
‫‪20‬‬
‫מאי ‪10‬‬
‫פקודות מכונה לקריאה‪/‬כתיבה ל‪ports-‬‬
‫‪‬‬
‫מבנה פקודת ‪:IN‬‬
‫‪AL‬‬
‫‪port num‬‬
‫או‬
‫או‬
‫‪AX‬‬
‫‪IN‬‬
‫או‬
‫‪DX‬‬
‫‪‬‬
‫‪‬‬
‫‪EAX‬‬
‫קורא בית או מילה או מילה כפולה מתוך ה‪port-‬‬
‫לאוגר האקומולטור (‪)EAX ,AX ,AL‬‬
‫מספר ‪ port‬הוא קבוע בין ‪ 0‬ל‪255-‬‬
‫‪21‬‬
‫מאי ‪10‬‬
‫פקודות מכונה לקריאה‪/‬כתיבה ל‪ports-‬‬
‫‪‬‬
‫מבנה פקודת ‪:OUT‬‬
‫‪AL‬‬
‫‪AX‬‬
‫‪EAX‬‬
‫‪port num‬‬
‫או‬
‫או ‪OUT‬‬
‫או‬
‫‪DX‬‬
‫‪ ‬כותבת בית או מילה או מילה כפולה מהאקומולטור‬
‫(‪ )AL, AX, EAX‬ל‪.port-‬‬
‫‪ ‬מספר ‪ port‬הוא קבוע בין ‪ 0‬ל‪255-‬‬
‫‪22‬‬
‫מאי ‪10‬‬
‫פקודות מכונה לקריאה‪/‬כתיבה ל‪ports-‬‬
‫‪‬‬
‫דוגמאות‪:‬‬
‫‪ ‬קריאת תו מהמקלדת‬
‫‪IN AL, 60h‬‬
‫‪ ‬שליחת תו למדפסת‬
‫‪MOV DX, 378h‬‬
‫‪OUT DX, AL‬‬
‫‪‬‬
‫הערה‪ :‬אם רוצים לגשת ל‪ port-‬עם מספר גבוה מ‪255-‬‬
‫חייבים להשתמש רק בגרסת ‪ DX‬שמספרו המרבי הוא‬
‫‪65535‬‬
‫‪23‬‬
‫מאי ‪10‬‬
‫פקודות מכונה לקריאה‪/‬כתיבה ל‪ports-‬‬
‫‪ ‬אם משתמשים ב‪ AX-‬או ב‪ EAX-‬בפקודות ‪ IN‬ו‪-‬‬
‫‪ OUT‬הבתים המשמעותיים יותר נכתבים למספרי‬
‫‪ ports‬עוקבים‬
‫‪ ‬דוגמה‪:‬‬
‫‪OUT 200, AX‬‬
‫‪ AL ‬נכתב לתוך ‪ port‬מספר ‪ AH ,200‬נכתב לתוך‬
‫‪ port‬מספר ‪201‬‬
‫‪24‬‬
‫מאי ‪10‬‬
‫פקודות מכונה לקריאה‪/‬כתיבה ל‪ports-‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪25‬‬
‫אי אפשר לכתוב ל‪ port-‬בצורה לא מסודרת‬
‫לכל ‪ port‬מוגדר פרוטוקול של בדיקות סטאטוס‬
‫ואישורי קבלה‬
‫רב מספר ה‪ ports-‬אינם מנוצלים ולא מחברים דבר‪.‬‬
‫שום תקלה לא נגרמת כשקראים או כותבים זבל‬
‫ל‪ port-‬שלא מחובר‪.‬‬
‫מאי ‪10‬‬
‫‪Memory Mapped I/O‬‬
‫‪ ‬מרחב כתובות נפרד מהזיכרון‬
‫‪ ‬כתובות מסוימות מנותבות להתקני ק‪/‬פ במקום‬
‫לזיכרון‬
‫‪ ‬מימוש בחומרה‬
‫‪ ‬דוגמה‪ :‬כתיבה‪/‬קריאה לזיכרון המסך‪:‬‬
‫‪ ‬סגמנטים ‪( A000h‬כתובת פיזית ‪B000h ,)640k‬‬
‫(כתובת פיזית ‪( B800h ,)704k‬כתובת פיזית‬
‫‪ )736k‬מנותבים לזיכרון של כרטיס מסך של‬
‫מחשב‬
‫‪26‬‬
‫מאי ‪10‬‬
‫‪DMA‬‬
‫‪ ‬שילוב של שני מקרים קודמים‬
‫‪ ‬דרך ‪ ports‬המעבד מנחה ‪ chip‬של ‪ DMA‬לקרוא‬
‫ממקום מסוים בהתקן (נניח ‪ track‬מסוים בדיסק)‬
‫לזיכרון או להיפך‬
‫‪ ‬המידע לא עובר דרך המעבד ובזמן הזה המעבד‬
‫יכול להמשיך לעסוק בדברים אחרים‪ ,‬במקביל ל‪-‬‬
‫‪DMA‬‬
‫‪27‬‬
‫מאי ‪10‬‬
‫‪Support Chips‬‬
‫‪" ‬מעבדים קטנים" למשימות מיוחדות‬
‫‪ ‬מורידים משימות מהמעבד‬
‫‪ ‬ניתן לשנות התנהגותם על ידי כתיבה לאוגרים‬
‫שלהם דרך ‪ports‬‬
‫‪ ‬דוגמת ‪Timer – Support Chip‬‬
‫‪ ‬נתרכז בשני ‪ – Support Chips‬בקר הפסיקות‬
‫ובקר התקנים חיצוניים‬
‫‪28‬‬
‫מאי ‪10‬‬
‫דוגמה – קריאת תו מהמקלדת (פסיקה ‪)9‬‬
‫רק בחיבורים‬
‫למעבד יש‬
‫מספרי ‪port‬‬
‫בקר התקנים ‪8255‬‬
‫‪A8259‬בקר פסיקות‬
‫‪Port 61h‬‬
‫‪Port 20h‬‬
‫‪Port 60h‬‬
‫‪CPU‬‬
‫‪29‬‬
‫מאי ‪10‬‬
‫דוגמה – קריאת תו מהמקלדת‬
‫‪‬‬
‫‪‬‬
‫קרא את התו דרך ‪port 60h‬‬
‫הודע לבקר ההתקנים שהתו נקרא‪:‬‬
‫‪ ‬קרא תוכן ‪port 61h‬‬
‫‪ ‬הדלק את הביט העליון של מס' ה‪ 8‬ביט הזה ושגר אותו חזרה ל‪-‬‬
‫‪port 61h‬‬
‫‪ ‬כבה את הביט העליון של מס' ה‪ 8‬ביט הזה ושגר אותו חזרה ל‪-‬‬
‫‪port 61h‬‬
‫‪‬‬
‫‪30‬‬
‫הודע לבקר הפסיקות שהפסיקה טופלה דרך ‪ port 20h‬על‬
‫ידי שליחת מספר ‪ 20h‬לתוך ה‪port-‬‬
‫מאי ‪10‬‬