תרגול 6 החלפת הקשר Flashcards
(34 cards)
איזה רגיסטר
מצביע על הפקודה הבאה לביצוע
דגלים
רמת הרשאה נוכחית
Rip
Rflags
Cs
איפה מסומן שהגיע פסיקת חומרה
בrflags
ביט9
If
Intterhpt flaf
בגלל זה שמכבים אותו זה כיאילו כיבינו את פסיקות התוכנה
כמה פרמטרים אפשר להעביר לפונק
כמה שרוצים
6 ראשונים ברגיסטרים
השאר על המחסנית
בעת טיפול בקריאת מערכת או פסיקה מה צריך לעשות מערכת ההפעלה
איפה עושה זה? כלומר איפה שומר
איזה מקרואים עושים זו
לשמור את הרגיסטרים שהמעבד השתמש בהם
ולהחזיר אותם לפני שהוא מסיים
מגובה על מחסנית הגרעין
Push_rega
Pop_regs
יתרונות וחסרונות של החלפת הקשר
ניצול טוב יותר של משאבי המעבד במצבים כמו המתנה לדיסק
הקטנת זמן התגובה לתהליכים אינטרקטיבים
פוגע בנציחות המעבד בגלל הoverhead של החלפת הקשר
בעיקר הtlb שהולך לפח
איך קורת החלפת הקשר יזומה
התהליך עושה פעולה כלשהי שגורמת להחלפת ההקשת בעקיפין או ישירות
Read
Write
Exit
Sched_yield
פעולה שתגרום לשגיאה כמו seg fault
מה גורם להחלפת הקשת כפויה
ואיך נקראת
הפקעה
הגרעין לוקח בכוח את ההקשר
יכול לקנות בעקבות פסיקת שעון וסיום הזמן שהוקצה לתהליך
אירוע אסינכרוני שמעיר תהליך עדיף
לדוגמה תהליך זמן אמן שקיבל מהדיסק פסיקת דיסק
האם הגרעין ניתן להפקעה
כן
החלק מלינוקס 2.6
איזה פונקציית גרעין מפעילה החלפת הקשר
ולאיזה פונק היא קרואת
schedule()
היא תקרא לcontex_switch()
האם יש עוד פונקציות חוץ
מschedule()
שהו שער כניסה להחלפת הקשר
לא
איפה הרגיסטרים של תהליך נשמרים לפני החלפת ההקשר ממנו
ואיזה עוד פרט מידע צריך לשמור
במחסנית הגרעין ובpcb תחת שדה threads
את כתובת הבסיס למחסנית הגרעין
האם כל התהליכים חולקים את אותה מחסנית גרעין?
ואיל עוקבים אחרי זה?
לכל תהליך מחסנית גרעין משלו
שומרים את הבסיס אליה במבנה בשם tss
האם יש tss אחד לכל המערכת
אחד לכל מעבד
איפה בtss נשמרת הכתובת הבסיס למחסנית הגרעין
ומה צריכה לעשות החלפת ההקשר
בקשר לזה
Tss.sp0
החלפת הקשר צריכה לשנות את הערך לכתובת בסיס המחסנית גרעין של התהליך הבא
Tss ראשי תיבות
Task state segment
איפה נשמר כתובת הבסיס לtss
Tr
Register
איפה נשמר כתובת הבסיס למחסנית הגרעין לכל תהליך
ואיפה נשמר הראש שלה
בסיס בtss.sp0
ראש ב
Pcb.threads.rsp
שלבי החלפת הקשר
ברמת הפונקציות
מי ספציפית לארכיטקטורה
context_switch()
כללית ולא תלויית ארכיטקטורה
קוראת ל
__switch_to_asm()
אסמבלי כי ניגשת לרגיסטרים
תלויית ארכיטקטורה
__switch_to()
פונקצייתc
ספציפית לאריטקטורה כי ניגש למבנה tss
fork()
do_fork()
מי קורא למי
fork
קוראת ל
do_fork
כל קריאית המערכת הן כאלה
הסבר את שלבי הפעולה של
do_fork
מקצה pcb חדש ומחסנית גרעין חדשה
קוראת לפונק copy_thread()
שממלאת את מחסנית הגרעין של תהליך הבן כדי שיראה כיאילו הוא בעצמו קרא ל
Fork
ואז ל
__switch_to-asm
מעתיקה את רוב הpcb של האב לבן
Fdt ושגרת הטיפול בסיגנלים
משתמש במגנון cow כדי לחסוך זמן
מוסיפה את הבן לרשימת התהליכים הגלובלית
ולטבלת הערבול pid->pcb
מעבירה את הבן למצב task running ומכניסה אותו לrun queue
מחזירה את הpid של הבן שיחלחל בסוף לחזור לאב
Struct pt_regs
מה שומר ולמה משומש
שומר את ערכי כל הרגיסטרים
נשמרים במבנה מסוג זה בקריאה למאקרו push_regs
שמגבה את הרגיסטר למחסנית
Struct inactive_task_frame
בטיפוס כזה
שומרים את ערכי הרגיסטרים
לאחר קריאה ל
__switch-to-asm
פונקציה task_pt_regs
מה עושה
מתי בשימוש
מקבלת מצביע לpcb
ומוצאת את המבנה
Pt_regs עם ערכי הרגיסטרים של התהליך
copy_theads()
משתמשת בו כדי למצוא את ערכי הרגיסטרים של האב והבן כדי להעתיק את ערכי האב לבן
למה copy_threads
משנה את רגיסטר
Rax=0
לתהליך הבן
כי הבן מקבל 0 בחזרה מfork