פוסט קטן, אבל כדאי להכיר וזה יכול להועיל. מעבר לזה, הנושא המדובר מופיע בקטעי הקוד שיופיעו בהמשך.
נראה כאן איך להכניס פרמטרים ל-module בזמן ההרצה. לדוגמא:
נראה כאן איך להכניס פרמטרים ל-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 בעצמה. אם הערך יהיה שונה מאפס - ע"י הכנסתו באופן אינטראקטיבי, הרגיסטרציה תתבצע עם הערך שנכניס.
דוגמאות בתחתית הקוד.
- int major_number = 0;
- module_param(major_number, int, S_IRUGO);
- int init_module(void)
- {
- Major = register_chrdev(major_number, DEVICE_NAME, &fops);
- if (Major < 0) {
- printk(KERN_ALERT "Registering char device failed with %d\n", Major);
- return Major;
- }
- printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
- printk(KERN_INFO "the driver, create a dev file with\n");
- printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
- printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
- printk(KERN_INFO "the device file.\n");
- printk(KERN_INFO "Remove the device file and module when done.\n");
- return SUCCESS;
- }
דוגמאות:
נכניס 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.
אין תגובות:
הוסף רשומת תגובה