נתון הקוד של התוכנית C הבאה. הבהרה: uint32_t מייצג טיפוס שלם אי-שלילי של 32-ביט. באופן דומה uint64_t מייצג טיפוס שלם אי-שלילי של .64-ביט הנחה: המערכת היא לינוקס 32-ביט כפי שנלמדה בתירגולים. 1 uint64_t extend(uint32_t low, uint32_t high) { 2 uint64_t lsw = (uint64_t)low; // convert to 64 bit 3 uint64_t msw = (uint64_t)high << 32; 4 return msw | lsw; 5 } 6 7 int main(int argc, char* argv[]) { 8 // ... 9 uint64_t l = extend(0x1234, 0x51); 10 // ... 11 }
Full original question text (raw OCR)
שאלה 1 - קריאות לפונקציות נתון הקוד של התוכנית C הבאה. הבהרה: uint32_t מייצג טיפוס שלם אי-שלילי של 32-ביט. באופן דומה uint64_t מייצג טיפוס שלם אי-שלילי של .64-ביט הנחה: המערכת היא לינוקס 32-ביט כפי שנלמדה בתירגולים. 1 uint64_t extend(uint32_t low, uint32_t high) { 2 uint64_t lsw = (uint64_t)low; // convert to 64 bit 3 uint64_t msw = (uint64_t)high << 32; 4 return msw | lsw; 5 } 6 7 int main(int argc, char* argv[]) { 8 // ... 9 uint64_t l = extend(0x1234, 0x51); 10 // ... 11 }
(5 נק') השלימו את תמונת המחסנית בהרצת התוכנית כאשר היא נמצאת בשורה 4 לעיל. הסבירו את תשובתכם לפני הקריאה ב-main כתובת החזרה return address Old esi Old edi Old ebx
libc syscall wrapper caching pitfalls(5 נק') באיזה רגיסטר או רגיסטרים תוחזר תוצאת החישוב ומה יהיו הערכים ברגיסטרים אלו? הסבר.
libc syscall wrapper caching pitfalls(5 נק') בהנחה ש-main עושה שימוש בכל הרגיסטרים לפני הקריאה ל-extend ולאחר הקריאה ל-extend אילו רגיסטרים חייבים להישמר על-ידי main טרם הקריאה ל-extend? הסבר.
libc syscall wrapper caching pitfalls(5 נק') בתרגולים ראינו שניתן במקרים מסויימים להגדיר פונקציות עם קונבנציית קריאה בסגנון FASTCALL. באופן דומה לסעיף א, השלימו את מצב המחסנית בשורה 4 בתוכנית לעיל, כאשר מוסיפים את השורה הבאה לפני הגדרת הפונקציה extend (נניח בשורה 0): unsigned long long extend(unsigned int low, unsigned int high) __attribute__((regparm(2))); return address
libc syscall wrapper caching pitfalls(5 נק') הצג מימוש קצר ככל האפשר ב-assembly לפונקציה extend מסעיף ד. הסבר את המימוש:
libc syscall wrapper caching pitfalls
The exam question — original PDF
pages 2, 3, 4Exactly 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.
קריאת המערכת 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
The exam text, the skills it tests, and the exact slides are already in context.