יום שישי

module_param הכנסת פרמטרים בזמן ריצה

פוסט קטן, אבל כדאי להכיר וזה יכול להועיל. מעבר לזה, הנושא המדובר מופיע בקטעי הקוד שיופיעו בהמשך.
נראה כאן איך להכניס פרמטרים ל-module בזמן ההרצה. לדוגמא:
sudo insmod schemod.ko major_number=155.
כאן לתוך משתנה של ה-driver ששמו major_number, יוכנס הערך 155. בדוגמא שנראה כאן, הערך שיוכנס ישמש לקביעת ה-major number.
אין הגבלה על מספר הפרמטרים שאפשר להכניס. עבור כל פרמטר כזה יש להכניס שורה בקובץ התוכנית - המאקרו module_param.
הנה השורה:

module_param(name, type, permission);
המקרו מקבל 3 פרמטרים. 
1. שם הפרמטר - למשל "major_number"/
2. type - למשל int.
3. permission - נסתפק בהכרות עם  S_IRUGO, שמשמעותו - הפרמטר יכול להיות נקרא ע"י כולם אך אינו ניתן לשינוי.


נשתמש בדוגמא מהפוסט הקודם, ונראה הכנסת ערך למשתנה בשם -major number באופן אינטראקטיבי. 

הפונקציה המעניינת אותנו היא רק ה-init_module. התוספות החדשות מודגשות בצהוב.
שורה 1: הגדרת משתנה major_number והכנסת הערך 0 אליו. הערך 0 יגרום למערכת לבחור major number באופן אוטומטי. שימו לב - זהו משתנה גלובלי, שאת ערכו נוכל לעקוף ע"י הכנסת ה-module_param.
שורה 2:המאקרו שמאפשר הכנסה אינטראקטיבית של ערך לתוך major_number. עבור כל משתנה שנרצה לאפשר הכנסות כפרמטר, יש להכניס שורה כזו.
עד כאן סיימנו את הפעולות הדרושות להכנסת הפרמטר. המשך ההסבר נוגע לאפליקציה ולשימוש שהיא עושה בערך שהוכנס אליה.
שורה 6: המשתנה major_number מוכנס לפונקציית הרגיסטרציה בשדה של ה-major number. אם הוא ישאר 0, המערכת תבחר major number  בעצמה. אם הערך יהיה שונה מאפס - ע"י הכנסתו באופן אינטראקטיבי, הרגיסטרציה תתבצע עם הערך שנכניס.
דוגמאות בתחתית הקוד.

    1. int  major_number =   0;
    2. module_param(major_number, int, S_IRUGO);

    3. int init_module(void)
    4. {
    5.         Major = register_chrdev(major_number, DEVICE_NAME, &fops);

    6. if (Major < 0) {
    7.  printk(KERN_ALERT "Registering char device failed with %d\n", Major);
    8.  return Major;
    9. }

    10. printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
    11. printk(KERN_INFO "the driver, create a dev file with\n");
    12. printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
    13. printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
    14. printk(KERN_INFO "the device file.\n");
    15. printk(KERN_INFO "Remove the device file and module when done.\n");

    16. return SUCCESS;
    17. }

    דוגמאות:
    נכניס  major_number אינטראקטיבית:
    $ sudo insmod ./chardev.ko major_number=245

    נבדוק את התוצאה בקובץ devices:


    $ cat /proc/devices | grep 245

    245 chardev



    נסיר את המודול ונתקין שנית ללא הכנסת ערך אינטראקטיבית ל-major_number:
    sudo rmmod  ./chardev  
    sudo insmod ./chardev.ko 






    נבדוק את התוצאה:

    ronen@ronen-h:~/linux_kernel/chardev$ cat /proc/devices | grep 249
    249 chardev

    הערך של ה-major נבחר אוטומטית והוא הוא 249.









                                          אין תגובות:

                                          הוסף רשומת תגובה