Full original question text (raw OCR)
שאלה 4 - מודולים (20 נק') 1. (2 נק') מודולים מאפשרים להוסיף לגרעין לינוקס, בזמן ריצה, קטעי קוד חדשים שרצים בהרשאות משתמש. הטענה נכונה: כן / לא נימוק: 2. (2 נק') האם ניתן ליצור 2 קבצי device בעלי אותו minor number? הטענה נכונה: כן / לא נימוק: 3. (3 נק') מני 2 הבדלים בין התקן תווים להתקן בלוקים תשובה: 4. (2 נק') נתונות הפקודות הבאות: 1. cat /dev/zero 2. echo "hi" > /dev/null 3. echo "hi" > /dev/random 4. cat /dev/null הקיפי את כל הפקודות אשר יתקבל בהן EOF נימוק: 5. (3 נק') המקרו MAJOR והמקרו MINOR מחזירים את המספר הראשי (major number) והמספר המשני (minor number) עבור התקן (device) מסוים. מהיכן הם שולפים אותם (כלומר איפה הם שמורים)? א. file descriptor של ההתקן ב. במבנה נתונים ייעודי של הגרעין (שהוא לא chrdevs) ג. בכניסות המתאימות במערך chrdevs ד. בתוך הinode של ההתקן. נימוק: 6. (4 נק') נתאר את התרחיש הבא: יצרנו 2 מודולים עם אותו הקוד בדיוק, ורק שמות המודולים הם שונים. כעת נטען את 2 המודולים עם major numbers שונים: M1, M2. כעת, ניצור שני קבצי device: 1. /dev/a בעל major number ששווה ל M1 2. /dev/b בעל major number ששווה ל M2 כאשר תהליך יפתח את dev/b/ ויבצע פעולה שתגרור קריאה לioctl, איזו טענה נכונה? A. הנתונים לא מספקים מספיק מידע כדי לדעת איזה מבין המודולים יבצע את הפעולה- זה תלוי בין היתר גם minor number שלהם. B. המודול M1 יבצע את הקריאה ioctl C. המודול M2 יבצע את הקריאה ioctl D. שני המודולים יבצעו את הקריאה נימוק: 7. (4 נק') נסתכל על קטע הקוד הבא: 1. #define MOD_NAME "MY_MODULE" 2. int my_major = 0; struct file_operations my_fops = { .open = my_open, .release = my_release, .read = my_read, .write= my_write, .llseek= NULL, .ioctl= my_ioctl, .owner= OWNER, }; 3. my_major = register_chrdev(my_major, MOD_NAME, &my_fops); בהנחה שקיים מודול בשם "MY_MODULE", ושכל הפונקציות של my_fops ממומשות כראוי, אילו מהטענות הבאות נכונה? A. בסיום שורה 3 יירשם דרייבר עם MAJOR NUMBER ששווה ל- 0 B. רישום הדרייבר לא יתבצע מכיוון שלא העברנו את הMINOR NUBER כפרמטר C. בסיום שורה 3 יירשם דרייבר עם MAJOR NUMBER שהמערכת תקצה D. רישום הדרייבר לא יתבצע מכיוון שב my_fops הפונקציה llseek מצביעה על NULL נימוק:
(2 נק') מודולים מאפשרים להוסיף לגרעין לינוקס, בזמן ריצה, קטעי קוד חדשים שרצים בהרשאות משתמש. הטענה נכונה: כן / לא נימוק:
libc syscall wrapper caching pitfallsHard link vs symlink inode behavior(2 נק') האם ניתן ליצור 2 קבצי device בעלי אותו minor number? הטענה נכונה: כן / לא נימוק:
libc syscall wrapper caching pitfallsHard link vs symlink inode behavior(3 נק') מני 2 הבדלים בין התקן תווים להתקן בלוקים תשובה:
libc syscall wrapper caching pitfallsHard link vs symlink inode behavior(2 נק') נתונות הפקודות הבאות: 1. cat /dev/zero 2. echo "hi" > /dev/null 3. echo "hi" > /dev/random 4. cat /dev/null הקיפי את כל הפקודות אשר יתקבל בהן EOF נימוק:
libc syscall wrapper caching pitfallsHard link vs symlink inode behavior(3 נק') המקרו MAJOR והמקרו MINOR מחזירים את המספר הראשי (major number) והמספר המשני (minor number) עבור התקן (device) מסוים. מהיכן הם שולפים אותם (כלומר איפה הם שמורים)? א. file descriptor של ההתקן ב. במבנה נתונים ייעודי של הגרעין (שהוא לא chrdevs) ג. בכניסות המתאימות במערך chrdevs ד. בתוך הinode של ההתקן. נימוק:
Hard link vs symlink inode behavior(4 נק') נתאר את התרחיש הבא: יצרנו 2 מודולים עם אותו הקוד בדיוק, ורק שמות המודולים הם שונים. כעת נטען את 2 המודולים עם major numbers שונים: M1, M2. כעת, ניצור שני קבצי device: 1. /dev/a בעל major number ששווה ל M1 2. /dev/b בעל major number ששווה ל M2 כאשר תהליך יפתח את dev/b/ ויבצע פעולה שתגרור קריאה לioctl, איזו טענה נכונה? A. הנתונים לא מספקים מספיק מידע כדי לדעת איזה מבין המודולים יבצע את הפעולה- זה תלוי בין היתר גם minor number שלהם. B. המודול M1 יבצע את הקריאה ioctl C. המודול M2 יבצע את הקריאה ioctl D. שני המודולים יבצעו את הקריאה נימוק:
libc syscall wrapper caching pitfallsHard link vs symlink inode behavior(4 נק') נסתכל על קטע הקוד הבא: 1. #define MOD_NAME "MY_MODULE" 2. int my_major = 0; struct file_operations my_fops = { .open = my_open, .release = my_release, .read = my_read, .write= my_write, .llseek= NULL, .ioctl= my_ioctl, .owner= OWNER, }; 3. my_major = register_chrdev(my_major, MOD_NAME, &my_fops); בהנחה שקיים מודול בשם "MY_MODULE", ושכל הפונקציות של my_fops ממומשות כראוי, אילו מהטענות הבאות נכונה? A. בסיום שורה 3 יירשם דרייבר עם MAJOR NUMBER ששווה ל- 0 B. רישום הדרייבר לא יתבצע מכיוון שלא העברנו את הMINOR NUBER כפרמטר C. בסיום שורה 3 יירשם דרייבר עם MAJOR NUMBER שהמערכת תקצה D. רישום הדרייבר לא יתבצע מכיוון שב my_fops הפונקציה llseek מצביעה על NULL נימוק:
libc syscall wrapper caching pitfalls
The exam question — original PDF
pages 9, 10, 11Exactly as it appears on the exam paper.
Built from these components
Ordered basic → advanced. Master the earlier ones first.
Review the material
Read these before you answer — each verified slide teaches a component this question tests, and nothing from an unrelated topic is included. Tutorial slides show the actual slide image.
inodes & *stat syscalls • lstat(2) – Exactly the same as stat(2) if applied to a hard link – But if applied to a symlink, would return the information of this symlink (not to the target of the symlink) – In this case, POSIX says that the only fields within the stat structure that you can portably use are: • st_mode which will specify that the file is a symlink • st_size symlink content length (= length of target filepath) – The value of the rest of the fields could be valid, but it is not specified by POSIX – Notably, it is not specified if a symlink has a corresponding inode • Will be discussed shortly OS (234123) - files 34
קריאת המערכת exit()שאלה: למה בכלל לקרוא ל-exit(status) , אם אפשר פשוט לרשום return status בסוף פונקציית ה-main?תשובה: main היא לא באמת הפונקציה הראשית של התכנית...main() נקראת ע"י __libc_start_main() שאוספת את ערך החזרה של main() וקוראת ל-exit().int __libc_start_main(…) { …… exit(main(…));}מסקנה: הפונקציה exit תמיד נקראת לסיום סטנדרטי של התוכנית.מערכות הפעלה - תרגול 218
קריאות המערכת getpid(), getppid()pid_t getpid();קריאת מערכת המחזירה לתהליך הקורא את ה-pid של עצמו.pid_t getppid();קריאת מערכת המחזירה את ה-PID של תהליך האב של התהליך הקורא.שאלה: מה המשמעות של getppid() == 1 עבור תהליך משתמש טיפוסי?תשובה: תהליך האב הוא init. קורה למשל אם תהליך הבן יתום.מערכות הפעלה - תרגול 222
דוגמת קודמסכמתprintf("pid = %d\n", getpid());pid_t pid = fork();if (pid == 0) { printf("child pid = %d\n", getpid()); char* args[] = {"/bin/date", NULL}; execv(args[0], args); printf("This should not be printed\n");} else { wait(NULL); printf("parent pid = %d\n", getpid());}פלט לדוגמה:pid = 8919child pid = 8920Sun Oct 29 00:31:32 IDT 2017parent pid = 8919מערכות הפעלה - תרגול 224
בלינוקס יש שני סוגי קישורים (links)soft / symbolic linkln -s src dstקישור סימבולי הוא קובץ חדש עם inode נפרד מזה של הקובץ המקורי.כתיבה דרך הקישור כותבת לקובץ אליו הוא מצביע.מחיקת הקישור (באמצעות הפקודה rm) לא תמחק את הקובץ המוצבע.אפשר ליצור קישורים סימבוליים גם לקובץ שלא קיים.hard linkln src dstקישור קשיח הוא שם נרדף לקובץ המקורי כי הוא מצביע ישירות ל-inode של הקובץ המקורי.כתיבה דרך הקישור כותבת לקובץ אליו הוא מצביע.מחיקת הקישור תקטין את מונה הקישורים של הקובץ (כפי שנשמר ב-inode).הקובץ יימחק מהדיסק רק כאשר כל ה-hard links אליו יימחקו.מערכות הפעלה - תרגול 1213
>> rm /A/helloמערכות הפעלה - תרגול 1219inode #2type=dirdatanameinode #A5B7inode #5type=dirdatanameinode #…………inode #13type=soft_linkdatainode #7type=dirdatanameinode #soft13……data block/A/helloקישור "שבור"!dangling link
The exam text, the skills it tests, and the exact slides are already in context.