לדלג לתוכן

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

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

תרגיל 1 - הקצאת זכרון עם mmap

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


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

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

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


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

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

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

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


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

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

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

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


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

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

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