לדלג לתוכן

6.8 דרייברים תרגול

תרגיל 1 - סיור ב/dev/

  1. הריצו:

    ls -la /dev/ | head -30
    

  2. ענו:

  3. מצאו 3 קבצי התקן תו (character device) ו-3 קבצי התקן בלוק (block device). איך מזהים את הסוג?
  4. מה המספרים שמופיעים במקום גודל הקובץ? (רמז: major ו-minor)
  5. הריצו ls -la /dev/null ו-ls -la /dev/zero. מה המספרים הראשיים (major) שלהם? האם הם זהים? מה זה אומר?

  6. הריצו:

    ls -la /dev/sda*
    

  7. מה המספר הראשי (major) של כולם?
  8. מה ההבדל בין המספרים המשניים (minor)?
  9. הסבירו מה הקשר בין המספר המשני למחיצות.

תרגיל 2 - הבנת קוד הדרייבר

עיינו בקוד הדרייבר מההרצאה (mychardev) וענו:

  1. מה יקרה אם משתמש ינסה לכתוב יותר מ-1024 בתים להתקן? עקבו אחרי הקוד בפונקציה dev_write.

  2. למה הפונקציה dev_read משתמשת בפוינטר off (offset)? מה היה קורה בלעדיו אם היינו קוראים את ההתקן עם cat?

  3. למה חייבים להשתמש ב-copy_to_user ו-copy_from_user ולא סתם memcpy? מה יכול להשתבש אם נשתמש ב-memcpy ישירות? (רמז: חשבו על user space vs kernel space ועל page faults)

  4. מה הפרמטר הראשון של register_chrdev(0, DEVICE_NAME, &fops) - למה העברנו 0? מה היה קורה אם היינו מעבירים מספר ספציפי כמו 200?

  5. מה ההבדל בין open ל-release בfile_operations? האם release נקרא כל פעם שעושים close()? (רמז: חשבו על מצב שבו כמה file descriptors מצביעים לאותו file)


תרגיל 3 - major ו-minor בפעולה

  1. הריצו:
    cat /proc/devices
    

    הפקודה מציגה את כל הדרייברים הרשומים במערכת ואת המספרים הראשיים שלהם.
  2. מצאו את הדרייבר של mem (מספר ראשי 1). אילו התקנים ב-/dev/ משתמשים בדרייבר הזה?
  3. מצאו את הדרייבר של tty (מספר ראשי 4 או 5). כמה קבצי התקן ב-/dev/ שייכים לאותו דרייבר?

  4. הסבירו: למה /dev/null, /dev/zero, /dev/random כולם חולקים את אותו major number? הרי הם עושים דברים שונים לגמרי. איך הדרייבר יודע מה לעשות?


תרגיל 4 - מעקב אחרי הנתיב בקרנל

תארו את הנתיב המלא של הפקודה הבאה מuser space ועד לדרייבר:

cat /dev/null

עברו על כל השלבים:
1. מה הsyscalls שcat מבצע? (רמז: open, read, write, close)
2. מה קורה כשopen() מגיע לקרנל? איך הקרנל מזהה שזה קובץ התקן ולא קובץ רגיל?
3. איך הקרנל מוצא את הדרייבר הנכון? (major number)
4. מה הפונקציה read של /dev/null מחזירה?
5. מה cat עושה כשread מחזיר את הערך הזה?

עכשיו עשו את אותו הדבר עבור:

echo "hello" > /dev/null


תרגיל 5 - sysfs וudev

  1. הריצו:
    ls /sys/class/
    
  2. בחרו class אחד (למשל net או block) והיכנסו לתוכו
  3. מה המידע שזמין על ההתקנים בתוך הclass?

  4. הריצו:

    ls /sys/class/net/
    

  5. לכל ממשק רשת, הריצו:
    cat /sys/class/net/<interface>/speed
    cat /sys/class/net/<interface>/address
    cat /sys/class/net/<interface>/operstate
    
  6. הסבירו מה כל ערך אומר

  7. הריצו (אם יש לכם USB device מחובר):

    udevadm monitor
    

    ואז חברו/נתקו USB device. מה רואים? הסבירו את זרם האירועים.

  8. הסבירו בקצרה: מה היתרון של udev על פני יצירה ידנית של קבצים ב/dev/ עם mknod?