6.8 דרייברים תרגול
תרגיל 1 - סיור ב/dev/¶
-
הריצו:
-
ענו:
- מצאו 3 קבצי התקן תו (character device) ו-3 קבצי התקן בלוק (block device). איך מזהים את הסוג?
- מה המספרים שמופיעים במקום גודל הקובץ? (רמז: major ו-minor)
-
הריצו
ls -la /dev/nullו-ls -la /dev/zero. מה המספרים הראשיים (major) שלהם? האם הם זהים? מה זה אומר? -
הריצו:
- מה המספר הראשי (major) של כולם?
- מה ההבדל בין המספרים המשניים (minor)?
- הסבירו מה הקשר בין המספר המשני למחיצות.
תרגיל 2 - הבנת קוד הדרייבר¶
עיינו בקוד הדרייבר מההרצאה (mychardev) וענו:
-
מה יקרה אם משתמש ינסה לכתוב יותר מ-1024 בתים להתקן? עקבו אחרי הקוד בפונקציה
dev_write. -
למה הפונקציה
dev_readמשתמשת בפוינטרoff(offset)? מה היה קורה בלעדיו אם היינו קוראים את ההתקן עםcat? -
למה חייבים להשתמש ב-
copy_to_userו-copy_from_userולא סתםmemcpy? מה יכול להשתבש אם נשתמש ב-memcpy ישירות? (רמז: חשבו על user space vs kernel space ועל page faults) -
מה הפרמטר הראשון של
register_chrdev(0, DEVICE_NAME, &fops)- למה העברנו 0? מה היה קורה אם היינו מעבירים מספר ספציפי כמו 200? -
מה ההבדל בין
openל-releaseבfile_operations? האם release נקרא כל פעם שעושים close()? (רמז: חשבו על מצב שבו כמה file descriptors מצביעים לאותו file)
תרגיל 3 - major ו-minor בפעולה¶
- הריצו:
הפקודה מציגה את כל הדרייברים הרשומים במערכת ואת המספרים הראשיים שלהם. - מצאו את הדרייבר של mem (מספר ראשי 1). אילו התקנים ב-/dev/ משתמשים בדרייבר הזה?
-
מצאו את הדרייבר של tty (מספר ראשי 4 או 5). כמה קבצי התקן ב-/dev/ שייכים לאותו דרייבר?
-
הסבירו: למה /dev/null, /dev/zero, /dev/random כולם חולקים את אותו major number? הרי הם עושים דברים שונים לגמרי. איך הדרייבר יודע מה לעשות?
תרגיל 4 - מעקב אחרי הנתיב בקרנל¶
תארו את הנתיב המלא של הפקודה הבאה מuser space ועד לדרייבר:
עברו על כל השלבים:
1. מה הsyscalls שcat מבצע? (רמז: open, read, write, close)
2. מה קורה כשopen() מגיע לקרנל? איך הקרנל מזהה שזה קובץ התקן ולא קובץ רגיל?
3. איך הקרנל מוצא את הדרייבר הנכון? (major number)
4. מה הפונקציה read של /dev/null מחזירה?
5. מה cat עושה כשread מחזיר את הערך הזה?
עכשיו עשו את אותו הדבר עבור:
תרגיל 5 - sysfs וudev¶
- הריצו:
- בחרו class אחד (למשל net או block) והיכנסו לתוכו
-
מה המידע שזמין על ההתקנים בתוך הclass?
-
הריצו:
- לכל ממשק רשת, הריצו:
-
הסבירו מה כל ערך אומר
-
הריצו (אם יש לכם USB device מחובר):
ואז חברו/נתקו USB device. מה רואים? הסבירו את זרם האירועים. -
הסבירו בקצרה: מה היתרון של udev על פני יצירה ידנית של קבצים ב/dev/ עם mknod?