6.6 הקצאת זכרון בקרנל תרגול
תרגול - הקצאת זכרון בקרנל¶
תרגיל 1 - חקירת /proc/slabinfo¶
הריצו:
או השתמשו ב:
א. מצאו את ה-slab caches הבאים ורשמו כמה אובייקטים פעילים יש בכל אחד:
- task_struct
- dentry
- inode_cache
ב. מה גודל האובייקט (objsize) של כל אחד מהם?
ג. איזה slab cache תופס הכי הרבה זכרון במערכת שלכם?
תרגיל 2 - ניתוח /proc/buddyinfo¶
הריצו:
א. כמה דפים בודדים (order 0) חופשיים בZONE_NORMAL?
ב. כמה בלוקים רציפים של 1MB (256 דפים = order 8) חופשיים?
ג. אם קוד בקרנל קורא ל-kmalloc(8192, GFP_KERNEL), מאיזה order של buddy allocator יגיע הזכרון? (רמז: 8192 = 2 דפים)
תרגיל 3 - הבנת דגלי GFP¶
לכל אחד מהתרחישים הבאים, ציינו איזה דגל GFP צריך להשתמש בו ולמה:
א. פונקציה שרצה בהקשר של syscall של read ומקצה buffer זמני לעיבוד הנתונים.
ב. פונקציה שרצה בתוך interrupt handler של כרטיס רשת ומקצה buffer לפקט שהגיע.
ג. דרייבר שצריך להקצות buffer שהתקן DMA ישן (ISA) יוכל לגשת אליו.
ד. מה יקרה אם בטעות נשתמש ב-GFP_KERNEL בתוך interrupt handler?
תרגיל 4 - ניתוח שדות /proc/meminfo¶
הריצו:
א. מצאו את השדות Slab, SReclaimable, ו-SUnreclaim. מה הסכום של SReclaimable + SUnreclaim? האם הוא שווה ל-Slab?
ב. הסבירו: מה ההבדל בין SReclaimable ל-SUnreclaim? תנו דוגמה למה שנמצא בכל אחד מהם.
ג. מצאו את השדות VmallocTotal ו-VmallocUsed. מה הם מייצגים?
תרגיל 5 - מודול קרנל מושגי¶
נניח שאתם כותבים מודול קרנל שמנהל רשימה של מבנים מסוג:
א. כתבו קטע קוד (פסאודו-קוד של קרנל) שיוצר slab cache עבור struct my_item, מקצה 3 אובייקטים, ומשחרר אותם.
ב. מה היתרון של שימוש ב-slab cache ייעודי ל-my_item לעומת שימוש ב-kmalloc(sizeof(struct my_item), GFP_KERNEL) כל פעם?
ג. אם הייתם צריכים להקצות buffer של 2MB עבור עיבוד נתונים בתוך המודול, האם הייתם משתמשים ב-kmalloc או ב-vmalloc? הסבירו.