Presentation is loading. Please wait.

Presentation is loading. Please wait.

מערכות הפעלה תרגול 9 – פסיקות ב-Linux. מערכות הפעלה - תרגול 92 (c) ארז חדד 2003 תוכן התרגול מבוא לפסיקות ב-Linux פסיקות ב-IA32:  סוגי הפסיקות  טבלת.

Similar presentations


Presentation on theme: "מערכות הפעלה תרגול 9 – פסיקות ב-Linux. מערכות הפעלה - תרגול 92 (c) ארז חדד 2003 תוכן התרגול מבוא לפסיקות ב-Linux פסיקות ב-IA32:  סוגי הפסיקות  טבלת."— Presentation transcript:

1 מערכות הפעלה תרגול 9 – פסיקות ב-Linux

2 מערכות הפעלה - תרגול 92 (c) ארז חדד 2003 תוכן התרגול מבוא לפסיקות ב-Linux פסיקות ב-IA32:  סוגי הפסיקות  טבלת הפסיקות - ה-IDT  טיפול בפסיקות אתחול ה-IDT ב-Linux טיפול בפסיקות ב-Linux:  טיפול בחריגות  טיפול בפסיקות חומרה  דחיית הטיפול בפסיקות  סיום הטיפול

3 מערכות הפעלה - תרגול 93 (c) ארז חדד 2003 מבוא לפסיקות ב-Linux (1) תזכורת: פסיקה היא אות חשמלי הנשלח למעבד לציון אירוע הדורש את טיפולו המיידי  גורם למעבד להפסיק לבצע את הקוד הנוכחי ולעבור לבצע קוד מיוחד לטיפול בפסיקה בהרצאה קראנו לקוד הטיפול בפסיקה ISR – Interrupt Service Routine. כאן לא נשתמש במונח זה כי ב-Linux יש לו משמעות אחרת כפי שנראה בהמשך  התקני חומרה שולחים פסיקות למעבד כדי לקבל טיפול לדוגמה: לחיצת מקש במקלדת גורמת למקלדת לשלוח פסיקה למעבד על-מנת שיקרא את המידע על המקש שנלחץ

4 מערכות הפעלה - תרגול 94 (c) ארז חדד 2003 מבוא לפסיקות ב-Linux (2)  המעבד יכול לשלוח לעצמו פסיקות כתוצאה מביצוע קוד כדי לדווח על תקלה בביצוע או בכוונה כדרך לביצוע של הקוד המיועד לטיפול בפסיקה לדוגמה: פקודת חלוקה ב-0 גורמת לפסיקה  במערכת מרובת מעבדים, מעבדים יכולים לשלוח פסיקות זה לזה כאמצעי תקשורת, למשל לצורך חלוקת התהליכים ביניהם במערכות IA32 קיימים 256 סוגי פסיקות הממוספרים 0-255  המספר של פסיקה נקרא גם וקטור הפסיקה (interrupt vector)

5 מערכות הפעלה - תרגול 95 (c) ארז חדד 2003 מבוא לפסיקות ב-Linux (3) המעבד בודק אם יש פסיקות ממתינות לטיפול בין ביצוע של כל שתי הוראות עוקבות בקוד  פסיקה אינה יכולה לקטוע ביצוע של הוראת מכונה בסיסית בודדת לאחר סיום הטיפול בפסיקה, המעבד יכול להמשיך בביצוע הקוד המקורי, לאחר ששמר כתובת חזרה לפני הקפיצה לשגרת הטיפול

6 מערכות הפעלה - תרגול 96 (c) ארז חדד 2003 מבוא לפסיקות ב-Linux (4) פסיקה יכולה להשלח למעבד באופן אסינכרוני לחלוטין – ללא תלות במצב המעבד כרגע  כתוצאה מכך, פסיקות יכולות להגיע גם בזמן שהמעבד מטפל בפסיקה קודמת – קינון (nesting) של פסיקות במערכת מרובת מעבדים, מספר מעבדים יכולים לטפל בפסיקות שונות בו-זמנית

7 מערכות הפעלה - תרגול 97 (c) ארז חדד 2003 מבוא לפסיקות ב-Linux (5) הטיפול בפסיקות ב-Linux הוא בתחום אחריותו של הגרעין בלבד  בתגובה על פסיקה מבוצע מסלול בקרה בגרעין (Kernel Control Path) כזכור, הגרעין חייב לסנכרן את הגישה למבני הנתונים שלו כדי להגן עליהם מפני מסלולי בקרה מקוננים או מקבילים (במעבדים שונים) פסיקה מטופלת תמיד בהקשר הביצוע של התהליך הנוכחי  גם אם לתהליך אין קשר לפסיקה שקרתה טיפול בפסיקה מצריך מעבר ל-Kernel Mode כולל החלפת מחסניות לפי הצורך עבור התהליך הנוכחי  כלומר, בפסיקה מקוננת אין החלפת מחסניות כי המעבד כבר נמצא ב-Kernel Mode – פרטים בהמשך

8 מערכות הפעלה - תרגול 98 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (1) פסיקות אסינכרוניות - interrupts ("פסיקות" רגילות או פסיקות חומרה)  פסיקות אלו נשלחות ע"י התקני חומרה חיצוניים אל המעבד באופן אסינכרוני  חלקן ניתנות לחסימה (masking) ע"י דגל ה-Interrupt Flag (IF), ברגיסטר הדגלים פסיקה חסומה אינה מטופלת עד שהחסימה מוסרת כפי שראינו בתרגול הקודם, פקודות המכונה cli ו-sti חוסמות ומסירות את החסימה ע"י כיבוי והדלקת הדגל IF במהלך טיפול בפסיקת חומרה מבוצעת חסימה באופן אוטומטי  פסיקות מסוימות לא ניתנות לחסימה נקראות NMI – Non-Maskable Interrupts פסיקות אלו משמשות לדיווח על בעיות חומרה קריטיות, כגון נפילת מתח

9 מערכות הפעלה - תרגול 99 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (2)  הפסיקות מועברות אל המעבד באמצעות בקר פסיקות מתוכנת ([Advanced] Programmable Interrupt Controller – [A]PIC) נפרד לכל מעבד מעבד APIC שעון דיסק IRQ0 IRQ7 כרטיס קול מדפסת IRQ11

10 מערכות הפעלה - תרגול 910 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (3)  כל התקן חומרה המבקש לשלוח פסיקה שולח אות הקרוי IRQ – Interrupt ReQuest לאחד מקווי הכניסה של בקר הפסיקות אליו ההתקן מחובר ישנם 16-24 קווי כניסה ממוספרים IRQ0-IRQ15/IRQ23 מספר התקנים יכולים להיות מחוברים לאותו קו – IRQ Sharing ..ולכן טיפול בפסיקת חומרה מחייב בדיקת כל ההתקנים שיכלו לגרום לה  כאשר בקר הפסיקות מבחין בבקשה מהתקן חומרה, הוא מעביר אות פסיקה למעבד אליו הוא מחובר מספר הפסיקה הנוצרת עבור קו IRQn ניתן לבחירה. המקובל – (n+32)

11 מערכות הפעלה - תרגול 911 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (4) פסיקות סינכרוניות – exceptions ("חריגות")  נוצרות ע"י המעבד כתוצאה מביצוע הוראה אחרונה בקוד ולא ע"י רכיבים חיצוניים  לא תלויות בדגל הפסיקות  שלושה סוגים של חריגות: 1. Faults – מציינות תקלות הניתנות לתיקון בביצוע ההוראה האחרונה בקוד  כתובת החזרה בסיום הטיפול היא זו של ההוראה שגרמה את התקלה, כדי שהיא תבוצע מחדש  דוגמה: חלוקה ב-0

12 מערכות הפעלה - תרגול 912 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (5) 2. Traps – נגרמות באופן מכוון ע"י ההוראה האחרונה בקוד, כדי להפעיל את קוד הטיפול בפסיקה  Traps משמשות בדרך-כלל כדי להודיע ל-debugger על התקדמות בביצוע הקוד המכיל את ה-trap  ההוראה לביצוע בסיום הטיפול היא זו שאחרי ההוראה שגרמה ל- trap  דוגמה: הוראת המכונה int3 יוצרת חריגה שמטרתה להודיע ל- debugger שביצוע הקוד הגיע להוראה הנוכחית 3. Aborts – מציינות תקלות חמורות בביצוע ההוראה האחרונה בקוד  דוגמה: מנגנון בדיקה אוטומטי של הזיכרון יכול לייצר חריגה מסוג Machine Check בעקבות גילוי שיבוש בתכולת הזיכרון

13 מערכות הפעלה - תרגול 913 (c) ארז חדד 2003 סוגי פסיקות ב-IA32 (6)  חריגות מתוכנתות (Programmed Exceptions) או "פסיקות תוכנה" (Software Interrupts) הן סוג מסוים של Traps המשמשות לביצוע קריאות מערכת, כפי שכבר ראינו בתרגולים קודמים כזכור, ב-Linux ההוראה int 0x80 משמשת לקריאות מערכת

14 מערכות הפעלה - תרגול 914 (c) ארז חדד 2003 Interrupt Descriptor Table (1) הקישור ב-IA32 בין וקטור פסיקה לשגרת הטיפול בפסיקה מבוצע דרך טבלה הקרויה Interrupt Descriptor Table (IDT) רגיסטר מיוחד, idtr, מצביע לטבלת ה-IDT  טעינת ערך הרגיסטר idtr מבוצעת ע"י מערכת ההפעלה בזמן האתחול, בפקודת מכונה lidt ב-IDT יש רשומה עבור כל וקטור פסיקה  סה"כ 256 רשומות  כל רשומה בגודל 8 בתים  כל רשומה נקראת interrupt descriptor

15 מערכות הפעלה - תרגול 915 (c) ארז חדד 2003 Interrupt Descriptor Table (2) קיימים 3 סוגי רשומות ב-IDT: 1. Interrupt Gate – משמש עבור פסיקות חומרה  דגל ה-IF מכובה אוטומטית בגישה לטיפול דרך רשומה זו 2. Trap Gate – משמש עבור חריגות  אין שינוי ב-IF בגישה לטיפול בפסיקה דרך רשומה זו 3. Task Gate – מאפשר להגדיר תהליך שיזומן לטיפול בפסיקה  סוג זה אינו בשימוש ב-Linux, כי הגרעין מטפל בפסיקות

16 מערכות הפעלה - תרגול 916 (c) ארז חדד 2003 Interrupt Descriptor Table (3) כל רשומה ב-IDT מכילה:  ציון סוג הרשומה  כתובת (segment:offset) של שגרת הטיפול  DPL– ערך CPL מקסימלי הנדרש כדי להריץ את שגרת הטיפול נרצה שקוד המשתמש יוכל, באמצעות פסיקות תוכנה, לגרום לפסיקות מסוימות (קריאות מערכת, debugging) אבל לא יוכל להפעיל שגרות פסיקה המיועדות לדברים אחרים (כגון טיפול בדיסק וכו') לכן, רשומה של וקטור פסיקה המיועדת להפעלה מקוד משתמש תקבל DPL=3, ורשומות שאינן מיועדות לכך תקבלנה DPL=0

17 מערכות הפעלה - תרגול 917 (c) ארז חדד 2003 Interrupt Descriptor Table (4) DPLכתובת שגרת הטיפול seg:offs סוג הרשומה (gate) כניסה 0divide_errortrap0 3int3trap3 0general_protectiontrap13 0timerinterrupt32 0diskinterrupt43 3system_calltrap128 דוגמאות של רשומות בטבלת ה-IDT

18 מערכות הפעלה - תרגול 918 (c) ארז חדד 2003 טיפול בפסיקה ב-IA32 (1) המעבד מוצא את הכניסה המתאימה לוקטור הפסיקה ב- IDT וקורא את הרשומה שבה מבוצעות בדיקות הרשאות:  עבור פסיקות תוכנה בלבד – השוואת ה-CPL עם ה-DPL של הרשומה ב-IDT. אם ה-CPL גבוה יותר, נגרמת חריגה – General Protection Fault הרעיון – למנוע מקוד משתמש להריץ שגרות טיפול בפסיקה של גרעין מערכת ההפעלה שאינן מיועדות לשימושו באמצעות פסיקות תוכנה, כפי שראינו בשקף הקודם אם נגרמה חריגה, היא מטופלת במקום הפסיקה המקורית

19 מערכות הפעלה - תרגול 919 (c) ארז חדד 2003 טיפול בפסיקה ב-IA32 (2) אם הפסיקה קרתה ב-User Mode ושגרת הטיפול היא בגרעין (כפי שקורה ב-Linux) מתבצעת החלפת מחסניות כחלק מהמעבר ל- Kernel Mode  מצביע בסיס מחסנית הגרעין של התהליך הנוכחי נקרא מתוך ה-TSS ונטען ל-ss:esp  הערך הישן של ss:esp (מצביע לראש מחסנית התהליך ב-User Mode) נשמר במחסנית הגרעין הערכים הבאים נשמרים במחסנית הגרעין:  ערך רגיסטר הדגלים eflags  מצביע חזרה לקוד המקורי מלפני הפסיקה cs:eip בד"כ, של ההוראה הבאה לביצוע; עבור fault, של ההוראה שגרמה לפסיקה  עבור חריגות מסוימות נשמר קוד שגיאה - hardware error code: למשל, עבור פסיקה 16 (שגיאת floating point) נשמר קוד של סוג השגיאה

20 מערכות הפעלה - תרגול 920 (c) ארז חדד 2003 טיפול בפסיקה ב-IA32 (3) כתובת שגרת הטיפול בפסיקה נטענת מהרשומה ב-IDT לתוך cs:eip  בזה מעודכן גם ה-CPL. אם הפסיקה קרתה ב-User Mode, כאן הושלם המעבר ל-Kernel Mode מתבצעת שגרת הטיפול בפסיקה שגרת הטיפול צריכה להסתיים בהוראת iretdהמבצעת כדלקמן:  טוענת מהמחסנית את ערכי cs:eip ו-eflags  מחליפה מחסניות בחזרה אם צריך לחזור ל-User Mode ע"י טעינת ss:esp מהערך השמור במחסנית הגרעין  אם נשמר גם hardware error code, שגרת הטיפול בפסיקה צריכה לשלוף ערך זה מהמחסנית לפני הקריאה ל-iretd

21 מערכות הפעלה - תרגול 921 (c) ארז חדד 2003 אתחול ה-IDT ב-Linux (1) טבלת ה-IDT מאותחלת במקור ע"י ה-BIOS בזמן הטעינה, Linux מחליפה את כל הטבלה כולה ראשית, מופעלת הפונקציה setup_idt() המאתחלת את כל הרשומות בטבלה לערכי ברירת המחדל הבאים:  Interrupt Gate  כתובת השגרה ignore_int() שגרה זו מדפיסה הודעת "Unknown Interrupt" על המסך בתגובה לפסיקה שגרה זו לא צריכה להיות מופעלת לעולם. אם מקבלים הודעה זו סימן שיש בעיה בהתקנת המערכת או בעיה בחומרה (מייצרת פסיקות מיותרות/לא נכונות)  DPL=0 setup_idt() ו-ignore_int() מוגדרות באסמבלר בקובץ הגרעין arch/i386/kernel/head.S

22 מערכות הפעלה - תרגול 922 (c) ארז חדד 2003 אתחול ה-IDT ב-Linux (2) לאחר האתחול הראשוני, מבוצע מעבר נוסף על ה-IDT המעדכן את הכניסות המתאימות לטיפול בחריגות ובפסיקות מהחומרה המותקנת  במהלך פעולת המערכת ייתכן עדכון נוסף של הטבלה עקב התקנת drivers עדכון כניסה משתמש באחת הפונקציות הבאות, המוגדרות בקובץ הגרעין arch/i386/kernel/traps.c: set_intr_gate(n, addr)  כותבת interrupt gate בכניסה n בטבלה, עם DPL=0 וכתובת שגרת טיפול kcs:addr (kcs מציין את ה-code segment של הגרעין)  מיועדת לטיפול בפסיקות חומרה

23 מערכות הפעלה - תרגול 923 (c) ארז חדד 2003 אתחול ה-IDT ב-Linux (3) set_system_gate(n, addr)  כותבת system gate (trap gate לשימוש תהליכי משתמש) בכניסה n בטבלה  כתובת kcs:addr, DPL=3  שגרות טיפול בפסיקה הנקבעות באופן זה נגישות לכל תוכנית משתמש  משמשת לפסיקות debugging ולפסיקה 128 (0x80) המיועדת לקריאות מערכת set_trap_gate(n,addr)  כותבת trap gate בכניסה n בטבלה, עם כתובת kcs:addr ו- DPL=0  משמשת לטיפול בחריגות

24 מערכות הפעלה - תרגול 924 (c) ארז חדד 2003 אתחול ה-IDT ב-Linux (4) הפונקציה trap_init(), המוגדרת בקובץ הגרעין arch/i386/kernel/traps.c, מכילה חלק מהאתחול המשני של טבלת ה-IDT. להלן חלק מהפונקציה: set_trap_gate(0, &divide_error);... set_system_gate(4, &overflow);... set_trap_gate(6, &invalid_op);... set_trap_gate(13, &general_protection); set_intr_gate(14, &page_fault); set_trap_gate(16, &coprocessor_error);... set_system_gate(128, &system_call);


Download ppt "מערכות הפעלה תרגול 9 – פסיקות ב-Linux. מערכות הפעלה - תרגול 92 (c) ארז חדד 2003 תוכן התרגול מבוא לפסיקות ב-Linux פסיקות ב-IA32:  סוגי הפסיקות  טבלת."

Similar presentations


Ads by Google