לדלג לתוכן

6.6 הקצאת זכרון בקרנל תרגול

תרגול - הקצאת זכרון בקרנל

תרגיל 1 - חקירת /proc/slabinfo

הריצו:

sudo cat /proc/slabinfo | head -30

או השתמשו ב:

sudo slabtop -o

א. מצאו את ה-slab caches הבאים ורשמו כמה אובייקטים פעילים יש בכל אחד:
- task_struct
- dentry
- inode_cache

ב. מה גודל האובייקט (objsize) של כל אחד מהם?

ג. איזה slab cache תופס הכי הרבה זכרון במערכת שלכם?


תרגיל 2 - ניתוח /proc/buddyinfo

הריצו:

cat /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

הריצו:

cat /proc/meminfo

א. מצאו את השדות Slab, SReclaimable, ו-SUnreclaim. מה הסכום של SReclaimable + SUnreclaim? האם הוא שווה ל-Slab?

ב. הסבירו: מה ההבדל בין SReclaimable ל-SUnreclaim? תנו דוגמה למה שנמצא בכל אחד מהם.

ג. מצאו את השדות VmallocTotal ו-VmallocUsed. מה הם מייצגים?


תרגיל 5 - מודול קרנל מושגי

נניח שאתם כותבים מודול קרנל שמנהל רשימה של מבנים מסוג:

struct my_item {
    int id;
    char name[64];
    struct list_head list;
};

א. כתבו קטע קוד (פסאודו-קוד של קרנל) שיוצר slab cache עבור struct my_item, מקצה 3 אובייקטים, ומשחרר אותם.

ב. מה היתרון של שימוש ב-slab cache ייעודי ל-my_item לעומת שימוש ב-kmalloc(sizeof(struct my_item), GFP_KERNEL) כל פעם?

ג. אם הייתם צריכים להקצות buffer של 2MB עבור עיבוד נתונים בתוך המודול, האם הייתם משתמשים ב-kmalloc או ב-vmalloc? הסבירו.