שאלה 1 פסיקות, סיגנלים ותקשורת בין תהליכים א. לאחר של

Transcription

שאלה 1 פסיקות, סיגנלים ותקשורת בין תהליכים א. לאחר של
‫שאלה‪ ­ 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‬באחד‪ ‬מהשתיים‪) ‬או‪ ‬שניהם(‪ .‬‬
‫‪ ‬‬
‫עבור‪ ‬בחירות‪ ,1­3 ‬יש‪ ‬לבצע‪ ‬שינוי‪ ‬ב‪ PTE‬בלבד‪ :‬‬
‫יש‪ ‬צורך‪ ‬לדעת‪ ‬באיזה‪ ‬מהזיכרונות‪ ‬נמצא‪ ‬הדף‪ ,‬ולכן‪ ‬נצטרך‪ ‬להוסיף‪ ‬ביט‪ valid ‬חדש‪ ,‬עבור‪ ‬הזיכרון‪ ‬השני‪ .‬אם‪ ‬‬
‫קיים‪ ‬ביט‪ ‬פנוי‪ ‬בביטים‪ ‬לשימוש‪ ‬מ"ה‪ ,‬נוכל‪ ‬לנצל‪ ‬אותו‪ .‬אחרת­‪ ‬יש‪ ‬צורך‪ ‬להכפיל‪ ‬את‪ ‬גודל‪ ‬ה‪ PTE‬ולהוסיף‪ ‬‬
‫רמות‪ ‬בתרגום‪ ‬במידת‪ ‬הצורך‪ .‬‬
‫עבור‪ ‬בחירה‪ ,4 ‬בנוסף‪ ‬לשינוי‪ ‬שצוין‪ ‬לעיל‪) ‬עבור‪ ‬בחירות‪ (1­3 ‬יש‪ ‬צורך‪ ‬להוסיף‪ ‬ביט‪ ‬נוסיף‪) ‬באופן‪ ‬דומה‪ ‬לזה‪ ‬‬
‫של‪ ‬ה‪ (PTE‬לכל‪ ‬רמות‪ ‬התרגום‪ (… ,DIR, PGD) ‬ע"מ‪ ‬לדעת‪ ‬באיזה‪ ‬מהזיכרונות‪ ‬נמצאת‪ ‬טבלת‪ ‬החיפוש‪ ‬של‪ ‬‬
‫הרמה‪ ‬הבאה‪ .‬‬
‫ובכל‪ ‬זאת‪ ,‬יש‪ ‬להחליט‪ ‬שרירותית‪ ‬איפה‪ ‬נמצאת‪ ‬הטבלה‪ ‬הראשונה‪) (.…/PGD/PML4) ‬האם‪ ‬בזכרון‪ ‬‬
‫הראשון\שני\שניהם(‪ .‬‬
‫‪ ‬‬
‫ג‪ .‬כיצד‪ ‬יתבצע‪ ‬מנגנון‪ ‬התרגום‪ ‬של‪ ‬כתובת‪ ‬וירטואלית‪ ‬עבור‪ ‬המבנה‪ ‬החדש‪ ‬של‪ ‬הזיכרון‪ ‬כאשר‪ ‬ידוע‪ ‬שכל‪ ‬‬
‫הדפים‪ ‬שדרושים‪ ‬בדרך‪ ‬נמצאים‪ ‬בזיכרון?‪ ‬‬
‫פתרון‪ :‬‬
‫‪ ‬‬
‫עבור‪ ‬בחירות‪ 1­3 ‬מסעיף‪ ‬קודם‪ ,‬באותו‪ ‬אופן‪ ‬כמו‪ ‬מקודם‪ ,‬נשתמש‪ ‬בזכרון‪ ‬בו‪ ‬נמצאת‪ ‬הטבלה‪ .‬עבור‪ ‬בחירה‪4 ‬‬
‫‪ ,‬בעת‪ ‬תרגום‪ ‬כתובת‪ ,‬עבור‪ ‬כל‪ ‬טבלת‪ ‬חיפוש‪ ‬בדרך‪ ,‬אם‪ ‬ביט‪ ‬ה‪ valid‬הראשון‪ ‬דולק‪ ,‬נחפש‪ ‬את‪ ‬הטבלה‪ ‬‬
‫הבאה‪) ‬או‪ ‬הדף‪ ‬עצמו(‪ ‬בזיכרון‪ ‬הראשון‪ ,‬אחרת‪ ,‬אם‪ ‬הביט‪ ‬השני‪ ‬דולק‪ ‬נחפש‪ ‬בשני‪ .‬אם‪ ‬שני‪ ‬הביטים‪ ‬כבויים‪ ,‬‬
‫הרשומה‪ ‬בטבלה‪ ‬אינה‪ ‬תקפה‪ ,‬נעצור‪ ‬את‪ ‬החיפוש‪ ‬ונבצע‪ .page­fault ‬‬
‫‪ ‬‬
‫ד‪ .‬האם‪ ‬צריך‪ ‬לערוך‪ ‬שינוי‪ ‬במנגנון‪ ?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 ,‬‬
‫רק‪ ‬מקשרת‪ ‬בין‪ ‬מנהל‪ ‬ההתקן‪ ‬לבין‪ ‬המספר‪ ‬הראשי‪ .‬‬
‫‪ ‬‬
‫____________________________________________________________________‪ ‬‬
‫‪ ‬‬
‫‪ ‬‬
‫‪ ‬‬