שאלה 1 פסיקות ,סיגנלים ותקשורת בין תהליכים א .לאחר שלמדו על סיגנלים התווכחו ביניהם שני סטודנטים בקורס מערכות הפעלה . סטודנט א' טען" :בלינוקס אין קינון של סיגנלים ולכן לעולם לא נצטרך להשתמש במנגנוני סנכרון בעת מימוש הנדלר של סיגנל" . ואילו סטודנט ב' טען" :יתכנו מצבים בהם כן נצטרך להשתמש במנגנוני סנכרון בעת מימוש הנדלר של סיגנל" מי משניהם צודק? הסבר/הסברי . פתרון : סטודנט ב' צודק . ניתן לקנן סיגנלים באמצעות דגל SA_NOMASK המועבר בשדה sa_flags של struct sigaction כאשר רושמים את ה) signal handlerמתוך ,man 2 sigaction חלק מהתקן של ,(POSIX יתר על כן ,גם כאשר לא מבטלים מיסוך של הסיגנל בו מטפלים ,אם רושמים signal handler יחיד לזוג סיגנלים ,שניהם יכולים להיקרא בחוטים שונים ,ולבצע אותה פונקציה בו"ז . ב .אם ביט ה if ב eflags כבוי ,השפעתה של פקודת המכונה sti מתחילה רק לאחר סיום פקודת המכונה שבאה אחריה . האם יש הבדל בין קטעי הקוד הבאים? אם כן מהו ,אם לא הסבר/הסברי מדוע . .i 2. sti cli 1. sti nop cli פתרון : קיים הבדל בין קטעי הקוד מכיוון שהשפעת sti מתעכבת בביצוע פקודה בודדה ,ושל cli מידית בקוד הימני ,המעבד לא יקבל את הפסיקות כי לאחר ביצוע cli דגל הפסיקות יהיה כבוי . בקוד השמאלי ,דגל הפסיקות יודלק מיד לאחר ביצוע ה nopואם יש פסיקות ממתינות ,הן יטופלו לפני ה .cli .ii 2. iret פתרון : לא קיים הבדל בין שני קטעי הקוד 1. sti iret אם הדגל if היה כבוי לפני הביצוע של Iret השפעת sti תתחיל אחרי ,ולכן ערך הדגל יהיה .0 אם הדגל if היה דלוק בכניסה לטיפול בפסיקה ה iretערכו של if בהכרח .1 בביצוע Iret נשחזר למעשה את ערכו הקודם .if ולכן שני הערכים זהים . ג .לאיזה פקודת shellדומה התוכנית הבאה? הסבירו . close(0); open(“./my_file”, O_RDONLY); execv(“/bin/cat”); פתרון : ראשית ,נבצע סגירה לפעולות הקלט הסטנדרטי.החל משלב זה) סגירת ה(fd descriptorלא ניתן לגשת להתקן הקלט דרך .fd נפתח את הקובץ my_file לקריאה בלבד ,ויציג את תוכן הקובץ . ועל כן ,נוכל להשתמש בפקודת ה shell cat < ./my_file לאותה המטרה . נהוג לעשות קריאת dup2 ע"מ לקבוע מספר של file descriptor ולא להסתמך על הקצאת" הראשון הכי נמוך" . שאלה 2 זיכרון וירטואלי השאלה מסתמכת על השינוי הבא במערכת הפעלה :Linux נניח כי כעת מערכת ההפעלה משתמשת בשני זיכרונות פיזיים ראשיים .כל נתון בזיכרון הוירטואלי יכול להופיע באחד הזיכרונות או בשניהם .אם הוא מופיע בשניהם אז הוא יופיע באותה כתובת פיזית .כעת במקום ביט present אחד יהיה שימוש בשני ביטים של .presentאם שניהם כבויים אז הדף לא נמצא בזיכרון .אם הביט הראשון דלוק ,אז הדף נמצא בזיכרון הראשון . אם השני דלוק ,אז הדף נמצא בזיכרון השני .אם שניהם דלוקים אז הדף נמצא בשני הזיכרונות .אנו עובדים עם מערכת של 32 ביט וגודל דף של 4K כרגיל . א .מה הוא גודל הזיכרון הוירטואלי המקסימאלי שאליו יכול לגשת תהליך במבנה החדש) תחת ההנחה שתהליך יכול להשתמש בכל מרחב הכתובות(? הסבירו . פתרון : ניתן לגשת ל 4GBזכרון כמו מקודם ,כיוון שגודל מרחב הכתובות לא השתנה . ב .האם צריך לבצע שינוי במנגנון התרגום של כתובת לפי טבלאות הדפים עבור השינוי? אם כן תארו מה השינוי? אחרת ,הסבירו מדוע לא . פתרון : ראשית יש להחליט איפה תהיה טבלת הדפים : .1תמיד בזיכרון הראשון .2תמיד בזיכרון השני .3תמיד בשניהם .4באחד מהשתיים) או שניהם( . עבור בחירות ,13 יש לבצע שינוי ב PTEבלבד : יש צורך לדעת באיזה מהזיכרונות נמצא הדף ,ולכן נצטרך להוסיף ביט valid חדש ,עבור הזיכרון השני .אם קיים ביט פנוי בביטים לשימוש מ"ה ,נוכל לנצל אותו .אחרת יש צורך להכפיל את גודל ה PTEולהוסיף רמות בתרגום במידת הצורך . עבור בחירה ,4 בנוסף לשינוי שצוין לעיל) עבור בחירות (13 יש צורך להוסיף ביט נוסיף) באופן דומה לזה של ה (PTEלכל רמות התרגום (… ,DIR, PGD) ע"מ לדעת באיזה מהזיכרונות נמצאת טבלת החיפוש של הרמה הבאה . ובכל זאת ,יש להחליט שרירותית איפה נמצאת הטבלה הראשונה) (.…/PGD/PML4) האם בזכרון הראשון\שני\שניהם( . ג .כיצד יתבצע מנגנון התרגום של כתובת וירטואלית עבור המבנה החדש של הזיכרון כאשר ידוע שכל הדפים שדרושים בדרך נמצאים בזיכרון? פתרון : עבור בחירות 13 מסעיף קודם ,באותו אופן כמו מקודם ,נשתמש בזכרון בו נמצאת הטבלה .עבור בחירה4 ,בעת תרגום כתובת ,עבור כל טבלת חיפוש בדרך ,אם ביט ה validהראשון דולק ,נחפש את הטבלה הבאה) או הדף עצמו( בזיכרון הראשון ,אחרת ,אם הביט השני דולק נחפש בשני .אם שני הביטים כבויים , הרשומה בטבלה אינה תקפה ,נעצור את החיפוש ונבצע .pagefault ד .האם צריך לערוך שינוי במנגנון ?COW אם כן ,הסבירו מה השינוי ,ואם לא ,הסבירו מדוע . פתרון : אין צורך בשינוי מנגנון ה ,COWאומנם ניתן ליעל אותו באופן הבא : בעת גישת כתיבה לזיכרון COW הנמצא ב 2הזיכרונות ,נוכל לשכפל רק את רשומות טבלת הדפים ,כך שבכל אחת יהיה רק ביט valid דולק אחד) אחר( ,כמו כן ,יש צורך לכבות את הביט valid המתאים בתרגום ב) TLBאו למחוק את הרשומה ולחכות שתיטען מחדש( .כך נחסוך העתקה של תוכן הדף . ה .האם צריך לערוך שינויים ב TLBעבור המבנה החדש? אם כן ,הסבר מה השינוי ואם לא הסבירו מדוע . פתרון : כן ,כיוון שהכתובת בשני הזיכרונות תהיה זהה ,אין צורך להחזיק 2 מספרי מסגרות ,יש להוסיף רק מנגנון המאפשר לדעת באיזה מהם הדף נמצא .אפשר לדעת זאת באופן דומה כמו בטבלת הדפים ,ע"י 2 ביטים המסמנים ,valid אחד לכל זכרון . ו .האם נדרש שינוי במבנה של טבלת המסגרות עבור המבנה החדש? אם כן ,הסבירו מה השינוי ואם לא הסבירו מדוע . פתרון : יש צורך להוסיף מימד לטבלת המסגרות ,כך שכל כניסה תחזיק struct page 2 ולא אחד ,כי כעת לכל כתובת יכולות להיות 2 מסגרות ,כאשר לכל אחת מהן count/mapping/index/flags שונים) למשל ייתכן כי הזיכרון הראשון dirty בזמן שהשני לא כי שניהם בשימוש ע"י דפים שונים במרחבי זכרון שונים( . שאלה 3 מודולים ענו נכון/לא נכון ונמקו ,תשובה ללא נימוק לא תתקבל . א .תהליך בהרשאת root יכול להרוג מודול באמצעות הפקודה .kill לא נכון נזכור כי מודול אינו תהליך ,כלומר לא קיים לו pid או מתאר תהליך ,ולכן לא נוכל להפעיל עליו את הפקודה .kill ____________________________________________________________________ ב .אם התבצעו n קריאות ל close אז התבצעו גם n קריאות ל .release לא נכון . בשימוש בחוטים ,נזכור כי טבלת ה descriptorsגלובלית לתהליך ,כלומר משותפת לכל החוטים שבו . במידה וכלל החוטים של תהליך יבצעו,close הראשון בלבד יבצע ,release וישחרר את טבלת ה . descriptors עבור שאר החוטים תוחזר ישירות שגיאה ,ו release לא תתבצע . ____________________________________________________________________ ג .כדי לקבל את ה pid של התהליך הנוכחי מודול יכול להשתמש בפקודה getpid אך מקובל להשתמש במאקרו currentכי זה יעיל יותר . נכון . מודול הוא קטע קוד שניתן להוסיף לגרעין בזמן ריצה .על כן ,נוכל להשתמש בפקודה getpid בכדי לקבל את ה pid כמו בכל קטע קוד אחר . ____________________________________________________________________ ד .ניתן להשתמש במספרי minor שונים על מנת לבחור איזה אובייקט file_operations יועבר ל register_chrdevעל ידי init_module ובכך להשיג פונקציונליות שונה לפעולות read ו .write לא נכון מספר משני משמש את מנהל ההתקן בכדי להבדיל בין התקנים שונים המחוברים אליו .בנוסף register_chrdev , רק מקשרת בין מנהל ההתקן לבין המספר הראשי . ____________________________________________________________________
© Copyright 2024