לדלג לתוכן

5.7 - מיפוי זכרון - תרגול

תרגול - מיפוי זכרון - mmap

תרגיל 1 - allocation זכרון עם mmap

כתבו תוכנית שמקצה 4096 בתים באמצעות mmap (מיפוי אנונימי פרטי), כותבת מחרוזת לתוך הזכרון שהוקצה, קוראת אותה בחזרה ומדפיסה אותה, ובסוף משחררת את הזכרון עם munmap.


תרגיל 2 - קריאת קובץ עם mmap

כתבו תוכנית שמקבלת נתיב לקובץ טקסט כפרמטר (argv[1]), ממפה את הקובץ לזכרון באמצעות mmap, ומדפיסה את תוכנו על ידי מעבר על הפוינטר הממופה בית אחרי בית. בסוף משחררים את המיפוי.

רמז: תצטרכו להשתמש ב-open, fstat (כדי לקבל את גודל הקובץ), ו-mmap.


תרגיל 3 - זכרון משותף בין processes

כתבו תוכנית שמשתמשת ב-mmap עם MAP_SHARED | MAP_ANONYMOUS כדי ליצור אזור זכרון משותף, ואז קוראת ל-fork.

  • process האב כותב את המספר 1234 לזכרון המשותף.
  • process הבן קורא את הערך ומדפיס אותו.

רמז: process האב צריך להמתין לprocess הבן עם wait.


תרגיל 4 - שינוי קובץ דרך mmap

כתבו תוכנית שממפה קובץ קיים עם MAP_SHARED (הרשאות קריאה וכתיבה), משנה את הבית הראשון בקובץ לתו 'X', ואז משחררת את המיפוי.

לאחר הרצת התוכנית, בדקו עם cat שהקובץ על הדיסק באמת השתנה.

רמז: תצטרכו לפתוח את הקובץ עם O_RDWR כדי שהמיפוי יוכל לכתוב אליו.


תרגיל 5 - שאלה תיאורטית

הסבירו: מדוע הקרנל משתמש ב-mmap כדי לטעון קבצי ELF להרצה, במקום להשתמש ב-read() כדי להעתיק את תוכן הקובץ לזכרון?

רמזים: חשבו על demand paging, על שיתוף pages בין processes, ועל קבצי הרצה גדולים.