1 / 28

מערכות הפעלה

מערכות הפעלה. תרגול 1 1 – ניהול זיכרון ב- Linux : המשך. תוכן התרגול (1). מתאר זיכרון מתאר אזור זיכרון טבלאות דפים טבלאות הדפים של תהליכים יצירת תהליך חדש TLB טבלאות דפים של הגרעין טיפול ב – Page Fault זיהוי החריגה טיפול במרחב הזיכרון של הגרעין טיפול במרחב הזיכרון של תהליך

olwen
Download Presentation

מערכות הפעלה

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. מערכות הפעלה תרגול 11 – ניהול זיכרון ב-Linux: המשך

  2. תוכן התרגול (1) • מתאר זיכרון • מתאר אזור זיכרון • טבלאות דפים • טבלאות הדפים של תהליכים • יצירת תהליך חדש • TLB • טבלאות דפים של הגרעין • טיפול ב – Page Fault • זיהוי החריגה • טיפול במרחב הזיכרון של הגרעין • טיפול במרחב הזיכרון של תהליך • Demand Paging מערכות הפעלה - תרגול 11

  3. מתאר הזיכרון של תהליך (1) • מתאר זיכרון (memory descriptor), הוא רשומה המכילה מידע על מרחב הזיכרון של התהליך • רשומה מסוג mm_struct • קובץ גרעין include/linux/process.h • השדה mm במתאר תהליך מצביע על מתאר הזיכרון של התהליך • מתארי תהליכים, החולקים אותו מרחב זיכרון, מצביעים על אותו מתאר זיכרון • לחוט גרעין ערך שדה mm הוא NULL – אין לו מרחב זיכרון משלו והוא משתמש במרחב הזיכרון ובמתאר הזיכרון של תהליך משתמש שזומן לריצה לפניו • כל מתארי הזיכרון שבמערכת מקושרים זה לזה ברשימה מקושרת מערכות הפעלה - תרגול 11

  4. מתאר הזיכרון של תהליך (2) • להלן מספר שדות המופיעים במתאר הזיכרון: • mmap – מצביע לרשימת מתארי אזורי הזיכרון • הרשימה של מתארי אזורי הזיכרון תמיד ממוינת לפי המיקום של כל אזור בזיכרון • pgd – מצביע ל-Page Global Directory של מרחב הזיכרון (שורש טבלאות הדפים – ראה בהמשך) • mmlist – מצביע קישור ברשימה הגלובלית של מתארי הזיכרון • rss – מספר המסגרות שבשימוש מרחב זיכרון זה (דפים בזיכרון הראשי) • total_vm – סה"כ דפים באזורי הזיכרון מערכות הפעלה - תרגול 11

  5. מתאר הזיכרון של תהליך (3) • mm_users, mm_count – מוני שיתוף של מרחב הזיכרון • mm_users סופר כמה תהליכי משתמש חולקים את מרחב הזיכרון • mm_count סופר כמה תהליכים (גרעין + משתמש) חולקים את מרחב הזיכרון, כאשר כל תהליכי המשתמש יחד נחשבים כאחד וכל תהליך גרעין בנפרד נחשב כאחד • כאשר mm_users = 0 , מפונים אזורי הזיכרון והטבלאות הממפות אותם. מרחב הזיכרון (וטבלאות המיפוי של אזור הגרעין) מפונה כאשר mm_count = 0. • בהתאם למה שהוזכר בעבר, חוט גרעין מנצל את מרחב הזיכרון של תהליך המשתמש שרץ לפניו, מפני שאין לו מרחב זיכרון משלו. mm_count נועד למנוע מצב בו מרחב הזיכרון מפונה כאשר הוא בשימוש ע"י חוט גרעין מערכות הפעלה - תרגול 11

  6. מתאר אזור זיכרון (1) • לכל אזור זיכרון במרחב הזיכרון יש, כאמור, מתאר איזור זיכרון (memory region object), שהוא רשומה המכילה מידע לגבי אזור הזיכרון. • vm_mm– מצביע למתאר הזיכרון של המרחב המכיל את האזור • vm_start – כתובת התחלה של אזור הזיכרון • vm_end – כתובת אחת אחרי האחרונה של אזור הזיכרון • vm_next – מצביע למתאר אזור הזיכרון הבא ברשימת האזורים של המרחב המכיל את אזור הזיכרון • vm_page_prot – ערכי ביטים שונים שיוצבו לכל הכניסות של הדפים באזור. • vm_flags – דגלים המציינים תכונות של האזור, למשל: • VM_READ, VM_WRITE, VM_EXEC, VM_SHARED – הרשאות: האם מותר לקרוא/לכתוב/לבצע נתונים בדפים באזור, האם מותר לשתף דפים באזור • לכל הרשאה כנ"ל מוגדרת "הרשאת הרשאה", לדוגמה: VM_MAY_WRITE: האם מותר להדליק את VM_WRITE • דגלים המציינים האם מותר לפנות את הדפים באזור מהזיכרון למאגר דפדוף ואיזה. לדוגמה – VM_LOCKED – אין לפנות את הדפים. VM_EXECUTABLE – הדפדוף הוא לקובץ ריצה. מערכות הפעלה - תרגול 11

  7. טבלאות הדפים • כפי שלמדנו בתרגול הקודם לכל תהליך קיימת טבלת דפים המכילה כניסה עבור כל דף במרחב הזיכרון של התהליך. • רגיסטר מיוחד בשם cr3 מצביעה על טבלת הדפים של התהליך הנוכחי. • הטבלה אמורה להכיל כניסה בגודל 4 בתים עבור כל דף במרחב הזיכרון של התהליך • כניסה של דף שלא הוקצה לשימוש מכילה ערך NULL (כל הביטים 0) • כדי למפות 4GB בדפים של 4KB צריך מיליון כניסות – גודל הטבלה יכול להגיע ל-4MB לכל תהליך • עם זאת, תהליך מנצל בדרך-כלל רק חלק מזערי ממרחב הזיכרון הוירטואלי – לא כדאי להחזיק את הטבלה כולה • הפתרון: להחזיק שתי רמות היררכיה (או יותר) בטבלה • אם מוקצה דף חדש לשימוש התהליך, צריך להקצות, לפי הצורך, דפים נוספים לטבלאות ביניים בהיררכיה עד (לא כולל) השורש מערכות הפעלה - תרגול 11

  8. 31 22 21 12 11 0 DIRECTORY TABLE OFFSET Page + Page Table PageGlobal Directory + + cr3 טבלת דפים בשתי רמות מערכות הפעלה - תרגול 11

  9. מבנה כניסה בטבלת הדפים • כניסה בטבלת הדפים היא בגודל bit 32. • המידע שכניסת הדפים מכילה תלוי בביט present המציין האם הדף נמצא בזיכרון הראש. • present = 1 – הדף נמצא בזיכרון הדפים ואז הכניסה מכילה בנוסף את השדות המתארים את הדף בזיכרון הראשי. • present = 0- הדף נמצא על הדיסק (זיכרון המשני)באזור swap. מערכות הפעלה - תרגול 11

  10. מבנה כניסה בטבלת הדפים (2) • present = 1, שדות המתארים דף בזיכרון הראשי: • מספר המסגרת בה מאוחסן הדף (20 ביטים כאשר הזיכרון הפיזי ממען 32 ביט) • ביט accessed: מודלק ע"י החומרה בכל פעם שמתבצעת גישה לכתובת בדף • ביט dirty: מודלק ע"י החומרה בכל פעם שמתבצעת כתיבה לנתון בדף • ביט read/write: הרשאת גישה. 0 = קריאה בלבד. 1 = קריאה וכתיבה • הרשאות הדף נקבעות לפי הרשאות האזור.ה"אלגוריתם" הוא: • אם יש הרשאת write באזור, מדליקים את r/w (הכל מותר) • אחרת, אם באזור יש הרשאת read או execute, מכבים את r/w (מותר רק לקרוא) • ביט user/supervisor: גישה מיוחסת. 0 = גישה לקוד הגרעין בלבד. 1 = גישה לכל תהליך. מערכות הפעלה - תרגול 11

  11. 31 8 7 1 0 מספר המגירה במאגר מספר המאגר 0 מבנה כניסה בטבלת הדפים (3) • present=0 , הדף נמצא במאגר דפדוף (swap) • מספר מאגר – מספר מאגר הדפדוף בו נמצא הדף ברשימת מאגרי הדפדוף. • מספר מגירה (slot) – מספר המגירה במאגר הדפדוף שבה נמצא הדף. • הצירוף שלעיל נקרא מזהה המגירה (Swapped-Out Page Identifier) • ביט 0 (שערכו 0) הוא המקום של הביט Present בכניסה בטבלת הדפים. מערכות הפעלה - תרגול 11

  12. כניסה בטבלת הדפים עבור דפים באזור זיכרון משותף • מתאר אזור זיכרון אינו ניתן לשיתוף. לכן אם לשניים (או יותר) תהליכים יש אזור זיכרון משותף, יהיה לכל אחד מהם מתאר אזור זיכרון משלו, שמצביע לרצף הדפים המשותף. • עבור כל דף באזור הזיכרון המשותף תהיה כניסה בטבלת הדפים של כל אחד מהתהליכים. • הכניסה הזו תצביע על אותה מסגרת/מגירה המכילה את הדף. • הכניסות המצביעות על אותו דף בטבלאות הדפים של תהליכים שונים יכולות להכיל הרשאות שונות. מערכות הפעלה - תרגול 11

  13. יצירת מרחב זיכרון לתהליך חדש (1) • תהליך בן יכול להיווצר כשותף למרחב הזיכרון של האב • למשל, כאשר יוצרים חוטים • במקרה זה רק מגדילים את מונה השיתוף (mm_users) של מתאר הזיכרון של תהליך האב • מאידך, תהליך הבן יכול לקבל מרחב זיכרון משלו • למשל, בקריאת fork() • במקרה שכזה צריך להעתיק את מרחב הזיכרון של האב לזה של הבן • פעולת העתקה פשוטה של מרחב זיכרון היא: • יקרה: הרבה זמן דרוש לביצוע העתקה של כל הדפים, דבר העלול להפוך את קריאת fork() למסורבלת מאוד • (ייתכן) מיותרת: אם תהליך הבן, כמקובל במקרים רבים, מבקש לטעון תוכנה חדשה מיד עם תחילת ביצועו (קריאה ל-execve()), אז מרחב הזיכרון שלו יאותחל מחדש, כך שההעתקה מיותרת מערכות הפעלה - תרגול 11

  14. יצירת מרחב זיכרון לתהליך חדש (2) • לפיכך, Linux משתמשת בטכניקת Copy On Write (COW), המקובלת בכל סוגי מערכות UNIX המודרניות: • דפים הניתנים לכתיבה שאינם יכולים להיות משותפים (כדוגמת דפי נתונים ומחסנית), מוגדרים בתחילה כמשותפים אבל מועתקים לעותק פרטי כאשר אחד התהליכים השותפים (האב או הבן) מנסה לכתוב אליהם לראשונה • שאר הדפים (כדוגמת דפי קוד או דפי נתונים לקריאה בלבד) הופכים למשותפים בין מרחבי הזיכרון של האב והבן • החסרון של טכניקת COW הוא שלאחר fork(), כתיבה ראשונה לכל דף שאינו משותף יקרה בגלל הטיפול בחריגת דף. מערכות הפעלה - תרגול 11

  15. יצירת מרחב זיכרון לתהליך חדש (3) • טכניקת COW משולבת ביצירת מרחב הזיכרון החדש של הבן ב-Linux באופן הבא: • הפונקציה copy_mm(), המופעלת מתוך do_fork(), יוצרת עבור תהליך הבן עותק של מתאר הזיכרון של תהליך האב • לכל אזור זיכרון של האב: • מתאר אזור הזיכרון מועתק למתאר אזור זיכרון חדש של הבן • הכניסות בטבלאות הדפים הממפות את האזור מועתקות לכניסות בטבלאות הבן – כל הדפים הופכים למשותפים • דפים ששייכים לאזור שאינו ניתן לשיתוף (VM_SHARE כבוי) וניתן לכתיבה (VM_MAY_WRITE דלוק) מסומנים בטבלת הדפים של האב והבן כדפים לקריאה בלבד (ביט r/rw כבוי) • אם דף משותף נמצא בזיכרון, מוגדל מונה השיתוף במסגרת (count). אחרת, עבור דף ממופה אנונימי שנמצא בדיסק, מוגדל מונה השיתוף במגירה. מערכות הפעלה - תרגול 11

  16. יצירת מרחב זיכרון לתהליך חדש (4) • ברגע שהאב או הבן ינסו לכתוב לדף, תיגרם חריגת Page Fault. • המערכת קובעת אם לשכפל את הדף לפי ערך count: • אם count > 1, הדף משוכפל לעותק חדש במסגרת מוקצית אחרת • במסגרת ה"ישנה" מבוצע count-- ובחדשה count == 1 • בעותק החדש מאופשרת הכתיבה • אחרת (count == 1), הגרעין פשוט מאפשר כתיבה בדף מערכות הפעלה - תרגול 11

  17. טיפול ב-TLB ב-Linux (1) • Translation Lookaside Buffer (TLB) - זהו מטמון (cache) של כניסות בטבלת הדפים הצמוד לכל מעבד, שמטרתו לחסוך תרגומים חוזרים של אותה כתובת ליניארית לפיזית (ראה תרגול קודם) • חוסך את הגישה לזיכרון (כפול מספר רמות ההיררכיה) לצורך חישוב • ישנם מצבים בהם גרעין Linux חייב לפסול בעצמו כניסות ב-TLB: • כאשר מתבצע עדכון של רשומה בטבלת הדפים המופיעה גם ב-TLB, כמו למשל בטעינת דף או בפינוי דף • בכל החלפת הקשר (למעשה, בכל טעינת ערך חדש ל-cr3) מתבצעת פסילה (invalidation) אוטומטית של תוכן ה-TLB של המעבד. מערכות הפעלה - תרגול 11

  18. טיפול ב-TLB ב- Linux (2) • ישנם מצבים בהם Linux מצליח להימנע מפסילת תוכן ה-TLB בעת ביצוע החלפת הקשר: • כאשר התהליך הבא לביצוע חולק את אותו מרחב זיכרון (אותן טבלאות דפים) יחד עם התהליך הקודם. • ..כלומר, כאשר מדובר בשני חוטים של אותו יישום • כאשר התהליך הבא לביצוע הוא חוט גרעין (kernel thread) כמו ksoftirq_CPUn • לחוטי גרעין אלו אין מרחב זיכרון משלהם – הם פועלים על מרחב הזיכרון של הגרעין. עם זאת, חוט גרעין מנצל את טבלאות הדפים של תהליך המשתמש שרץ לפניו, מפני שאין לו טבלאות דפים משלו. מערכות הפעלה - תרגול 11

  19. מרחב הזיכרון של הגרעין (1) • בתרגול הקודם הזכרנו ש 1GB של מרחב הזיכרון של המעבד שייך למרחב הזיכרון של הגרעין. • זיכרון זה כולל את טבלאות הדפים של התהליכים • הזיכרון שבשימוש גרעין Linux לעולם אינו מפונה לדיסק (swapped) • מרחב הזיכרון של הגרעין ממופה לקטע קבוע של הזיכרון הוירטואלי של כל תהליך • באופן זה, הכתובת (הלוגית) של כל אובייקט בגרעין נשארת קבועה בכל מרחבי הזיכרון של תהליכי המשתמש • קטע הזיכרון הליניארי המשמש את הגרעין הוא מהכתובת 0xc0000000 ומעלה ("הג'יגהבייט הרביעי"), המוגדרת בקבועים PAGE_OFFSET ו-TASK_SIZE • קבועים אלו מוגדרים בקבצי הגרעין include/asm-i386/page.h ו-include/asm-i386/processor.h בהתאמה מערכות הפעלה - תרגול 11

  20. מרחב הזיכרון של הגרעין (2) • הגרעין מחזיק טבלת דפים משלו הקרויה Kernel Master Page Global Directory • טבלה זו מתעדכנת בכל פעם שהגרעין מקצה ומשחרר דפים לשימוש עצמו בלבד • אף תהליך לא משתמש בטבלה זו – תפקידה הוא לשמש כמקור ממנו מתעדכנות טבלאות הדפים של תהליכי המשתמש בכל הנוגע לדפים שבשימוש הגרעין • על עדכון טבלאות הדפים של תהליכי המשתמש מתוך טבלת הדפים של הגרעין נלמד בהמשך מערכות הפעלה - תרגול 11

  21. טיפול ב-Page Fault ב-Linux (1) • מנגנון הטיפול בחריגות Page Fault הינו חלק מרכזי במנגנון הזיכרון הוירטואלי • באמצעות חריגה זו, החומרה מתריעה על אחת משתי האפשרויות הבאות: • גישה לדף שאינו נמצא בזיכרון • ביט present בכניסה המתאימה בטבלת הדפים כבוי • גישה לא חוקית (שלא לפי ההרשאות בטבלת הדפים) לדף שנמצא בזיכרון • למשל: ניסיון כתיבה לדף שמותר לקריאה בלבד • על הגרעין לנתח את נסיבות החריגה ולהחליט אם היא אכן חוקית או לא וכיצד לטפל בה • לדוגמה: גישה לדף שאינו נמצא בזיכרון ואינו בתוך אזורי הזיכרון אינה חוקית, בסופו של דבר, ויש לטפל בה ככזו • מאידך, ניסיון לכתיבה לדף שמותר לקריאה בלבד עשויה להיות חוקית בהחלט, כפי שקורה ב- Copy On Write מערכות הפעלה - תרגול 11

  22. טיפול ב-Page Fault ב-Linux (2) • החומרה מעבירה לשגרת הטיפול נתונים על החריגה: • קוד שגיאה של 3 ביטים הנשמר במחסנית: • אם ביט 0 כבוי, החריגה נגרמה בגישה לדף שאינו בזיכרון (present == 0). אחרת, החריגה בגלל גישה לא חוקית לדף בזיכרון • אם ביט 1 כבוי, הגישה הייתה לקריאה או לביצוע קוד. אחרת, הגישה הייתה לכתיבה • אם ביט 2 כבוי, הגישה הייתה כשהמעבד ב-kernel mode. אחרת, הגישה הייתה ב-user mode • ערך הכתובת הוירטואלית שגרמה לחריגה נשמר ברגיסטר cr2 • שגרת הטיפול בחריגה נקראת do_page_fault() ומוגדרת בקובץ הגרעין arch/i386/mm/fault.c • בשקפים הבאים נציג מקרים חשובים של טיפול ב-Page Fault כיצד הם מאובחנים ומטופלים מערכות הפעלה - תרגול 11

  23. עדכון טבלאות של דפי הגרעין (1) • אם הגישה הייתה לכתובת בגרעין (מעל TASK_SIZE) בדף לא קיים, במצב kernel mode (ביטים 0 ו-2 כבויים): • במקרה זה, כנראה שמדובר במצב שהגרעין הקצה לעצמו דפים ועדכן רק את הטבלאות המרכזיות שלו – ה-kernel master page global directory • טיפול התגובה הוא לפיכך קישור כל רמות ההיררכיה החסרות (מה-PGD ומטה) בטבלת מרחב הזיכרון הנוכחי לאילו של טבלאות הגרעין • אם אין אובייקטים מתאימים באחת הרמות בטבלה המרכזית של הגרעין, סימן שהגישה שגויה – הודעת תקלה והשבתת המערכת (kernel oops) מערכות הפעלה - תרגול 11

  24. עדכון טבלאות של דפי הגרעין (2) • בצורה זו מעודכנות טבלאות הדפים של מרחבי זיכרון של תהליכי משתמש לגבי דפים שבשימוש הגרעין • אם הגרעין משחרר דפים (ומעדכן את הטבלאות שלו בהתאם) השינוי משתקף מיידית בכל המרחבים האחרים משתי סיבות: • הגרעין לעולם לא משחרר את האובייקטים שבתוך הטבלה • הכניסות (מתחת ל-PGD) בטבלת הדפים של מרחב זיכרון מקושרות לאובייקטים שבתוך הטבלה של הגרעין (ולא להעתקים שלהם) מערכות הפעלה - תרגול 11

  25. דפדוף לפי דרישה (1) • אם הכתובת המבוקשת נמצאת בתוך אחד מאזורי הזיכרון, הגישה בהתאם להרשאות והדף המבוקש אינו בזיכרון, יש לטעון את הדף המבוקש לזיכרון • כפי שהזכרנו בתרגול הקודם, הטכניקה של טעינת דף כאשר הוא נדרש נקראת דפדוף לפי דרישה (Demand Paging) • יש שלוש אפשרויות לכך שהדף אינו בזיכרון (present == 0 בכניסה ב-PTE): • הכניסה מכילה ערך שאינו NULL, כלומר מזהה דף פיזי של דף ממופה אנונימי (נמצא במאגר דפדוף – swap) • הכניסה מכילה ערך NULL: • דף "בתול" - ממופה אנונימי שהתהליכים החולקים במרחב הזיכרון מעולם לא ניגשו אליו או לפחות מעולם לא כתבו אליו • דף ממופה לקובץ שפונה/לא נטען במרחב זיכרון זה מערכות הפעלה - תרגול 11

  26. דפדוף לפי דרישה (2) טיפול ב-Page Fault ב-Linux • במקרה של דף שנמצא בדיסק (ממופה אנונימי או ממופה לקובץ), מבוצעת טעינה של הדף מהדיסק, הפרטים בתרגול הבא. • אם הדף "בתול" אזי: • אם הגישה לכתיבה – מוקצית מסגרת חדשה הממולאת אפסים, הדף מסומן מלוכלך (PG_dirty מודלק) , נגיש לאחרונה mark_page_accessed() • אם בגישה לקריאה – הכניסה בטבלת הדפים מצביעה על מסגרת דף קבוע מיוחד הקרוי ZERO_PAGE וממולא אפסים. דף זה מסומן read-only, כך שבכתיבה הראשונה לדף הוא ישוכפל לעותק פרטי לפי עיקרון ה-Copy On Write • כפי שהוזכר קודם, פעולה של הוספת דף למיפוי הקיים יכולה לכלול גם הוספת כניסות מתאימות בכל הרמות של טבלת הדפים מערכות הפעלה - תרגול 11

  27. טיפול בתקלות • החריגה נקבעת כתקלה - גישה לא חוקית - אם: • הפעולה (קריאה או כתיבה) לא מורשית לפי הרשאות האזור • גישה מקוד משתמש לדפי הגרעין • גישה לכתובת בתחום המשתמש שאיננה בתוך אזור זיכרון • לכלל זה יש חריג אחד – כתיבה למחסנית, שעלולה "לגלוש" מעבר לאזור הזיכרון הנוכחי שלה • פעולת כתיבה יחידה למחסנית יכולה להגדיל אותה לכל היותר ב-32 בתים (פעולת pusha) • לכן, אם הפעולה היא כתיבה בהתאם להרשאות, אזור הזיכרון הוא מחסנית (VM_GROWDOWN דלוק), וכתובת הגישה היא עד 32 בתים מתחת לתחילת אזור המחסנית, מוקצה דף נוסף למחסנית וביצוע הכתיבה מאופשר • אם הגישה הייתה מקוד תהליך משתמש, נשלח לתהליך signal מסוג SIGSEGV, לאמור "גישה לא חוקית לזיכרון" • אם הגישה הייתה מקוד גרעין, מוכרזת תקלת מערכת – kernel oops מערכות הפעלה - תרגול 11

  28. Address in a memory region Write access Region is writable in User Mode Page is present Copy On Write Region is readable or executable Kill process and kernel “Oops” Demand paging Send SIGSEGV דיאגרמה של טיפול ב-Page Fault yes no yes no yes no bad_area yes no no yes Address is a wrong system call parameter yes no yes no “Fixup code” (typically send SIGSEGV) מערכות הפעלה - תרגול 11

More Related