linux drivers

selalerer

New member
linux drivers

OK, התחלתי ללמוד לכתוב drivers ללינוקס וההתחלה פשוטה למדיי (כתיבת מודולים לקרנל) אך יש לי בעיה עם הגרסאות. כרגע אני משתמש בדגל -f של insmod בכדי להתגבר על כך אבל זה ממש בעייתי ע"פ מה שכתוב איפה שאני קורא. הציעו שם לקמפל מחדש את הקרנל שלי, אבל גם לא עשיתי את זה מעולם וגם אני שואל את עצמי אם אני לא יכול להכתיב לתוכנית שלי בצורה יותר אלגנטית עבור איזה גירסת קרנל להתהדר? בנוסף הגעתי להסבר על current המצביע לתהליך הנוכחי שרץ ובכדי להשתמש בו הכללתי את linux/sched.h אבל אז הקומפיילר נותן לי מלא טעויות מתוך הנ"ל והמוכללים בו ובנוסף לא מזהה את current. מדוע? תודה, סלע.
 

gilad_no

New member
נסה בפורום לינוקס

יש שם כמה אנשים שמכירים את הקרנל ברמת הקוד ויוכלו לסייע לך.
 

gilad_no

New member
חס וחלילה ...

פשוט אני יודע על מספר אנשים שם (בעיקר מוליקס) אשר מתכנתים ברמת הקרנל ללינוקס. עד כמה שידוע לי (ואני שמח שטעיתי), רוב משתתפי הפורום מכירים יותר את סביבת חלונות מאשר לינוקס. אני מתנצל אם השתמעה נימה של זלזול מהודעתי. זאת לא הייתה הכוונה.
 
הכל ברוח טובה...../images/Emo26.gif

אם כי תכנות device-driver הוא לא לגמרי "תכנות קרנל"... זה רק מין plug-in לקרנל (הבחור החביב לא יצטרך לקמפל מחדש את הקרנל שלו למשל...)
 

galh

New member
הוא לגמרי "תכנות קרנל".

כתיבת device-driver זה הוספת קוד לקרנל. אז מה אם לא צריך לקמפל את הקרנל מחדש? הוא מוסיף יכולות חדשות לקרנל ברמה הכי נמוכה שאפשר במערכת הפעלה "מוגנת". בחלונות, אגב, זה הדרך היחידה לעשות את זה (ע"י כתיבת DD), כי אין לך את הקוד של הקרנל.
 
אכן...../images/Emo26.gif

הכוונה הייתה שאין צורך להכיר את הקרנל לעומק כדי לכתוב device-driver. אתה יכול לכתוב device-driver גם בלי לפתוח אפילו פעם אחת את הקוד של הקרנל....
 

annefan

New member
ככה

א. כדאי לך לקמפל קרנל. זה לא קשה, יש ב-taglines בפורום לינוקס מדריך מצוין. זה תרגיל טוב, גם כדי להבין מי נגד מי. ב. כתנאי מוקדם לשלב א', ואולי גם לפתרון השאלה שלך, תבדוק האם מותקנים אצלך, לכל הפחות ה-headers של הקרנל. זו חבילה עצמאית, שאיננה מותקנת בהתקנה רגילה. ה-headers האלה נחוצים כדי לקמפל מודולים, אבל כדי לקמפל את הקרנל עצמו, אתה צריך את כל הקוד שלו. ג. אני מניח שאתה מכיר את המדריך הזה, ואת הספר הזה. אם לא, הראשון (שהתעדכן ממש לאחרונה), מצוין להתחלה, ובלי השני ממש אי אפשר לזוז. ד. אם תעלה את הפלט של הקומפיילר יהיה יותר קל לעזור.
 

barakbl

New member
ההסבר די פשוט

הבעיה זה mod version או משהו כזה (שכחתי את הכינוי המקצועי של זה). מדובר בשיטה שבה כשאתה מהדר את הליבה היא אינה מקבלת את השם של הקרנל עצמו אלא עוד תוספת משהו כמו 2.4.20-vanilla שיכול לתאר קרנל ואנילה (יענו פשוט). יש פתרון לזה ברמת הידור המודולים, שלא התעמקתי בו. אני אישית בד"כ עובד עם ליבה שהידרתי לעצמי ואז אין את הבעיה. בגדול אין שום בעיה להשתמש ב f- אבל בכל מקרה מומלץ להדר ליבה. אני מציע לך לקרוא את הספר האלקטורני הבא, שדן בכתיבת דרייברים בלינוקס, הוא מסביר את כל הנושאים הבסיסים ושמעבר לבסיסים לעומק.
 
תשובות (לעניין):../images/Emo26.gif

לגבי הגרסאות - תוסיף את השורה הזו:
MODULE_LICENSE("GPL");​
לגבי השגיאות - שני דברים: 1) תוודא יש לך בשורת הקמפול את כל התגים הנחוצים (את DMODULE וכו') 2) תוודא שיש לך include נכון! לדוגמה - ב-makefile תעשה משהו כזה:
INCLUDEDIR = /usr/src/linux-2.4.18-3/include CFLAGS = -D__KERNEL__ -DMODULE -g -Wall -I$(INCLUDEDIR) mydd.o: mydd.c mydd.h $(CC) $(CFLAGS) -c mydd.c​
תגיד לי אם יש לך בעיות עם זה...
 

annefan

New member
שתי הערות

MODULE_LICENSE פןתר את הבעיה של tainted kernel, כלומר קרנל "מזוהם" בקוד שאיננו GPL. הוא לא פותר את בעיית הגרסאות. לגבי הספריות, לרוב עדיף להשתמש ב-/lib/modules/<version>.
 
כך או כך ../images/Emo26.gif

אם הוא ישתמש ב-MODULE_LICENSE ובספריות הנכונות - הוא יתגבר גם על בעיית הקמפול וגם על בעיית הגרסאות, לא?...
 

annefan

New member
תראה...

ברור שאם הוא יפתור את כל הבעיות, אז... לא יהיו לו בעיות!! שיעלה את הקוד ואת ה-makefile ואפשר יהיה לעזור יותר.
 

selalerer

New member
כרגע אני כותב את כל השאלות הללו

מהמחשב של ההורים, אבל היום או מחר אני מחבר את המחשב שלי לאינטרנט ואז אני יוכל להעלות קוד והודעות טעות וכו'.
 

selalerer

New member
תודה רבה, לכולם.

דבר ראשון אני שמח מאוד שיש לי עם מי לדבר פה ואני לא צריך להגר פורום. מקור הלימוד שלי הוא הספר שהזכירו פה Linux Device Drivers - 2nd Edition לגבי הקובץ make כתוב על זה בספר אבל לא מוסבר לעומק ואני לא ממש מבין מה זה. הוספתי בקוד את הקבועים:
#define __KERNEL__ #define MODULE #include <linux/module.h>​
והידרתי בצורה כזאת:
gcc -O -c -Wall myDD.c​
וטענתי אותו ככה:
insmod -f myDD.o​
וזה עבד. עד שניסיתי להכליל את
#include <linux/sched.h>​
ואז הוא עשה לי בעיות (זה היה רק לשם הבהרה מה קרה עד כה). בקשר לקבצי make הללו, זה פשוט קובץ סקריפט? איפה יש מדריך לאיך ליצור אחד? אני חייב אותו? בקשר לגרסאות, הוא אומר לי שהמודול הוא לגרסה 2.4.20 והקרנל הוא 2.4.20-8, ניסיתי אפילו לערוך את הקובץ o ולהוסיף לו את -8 אבל זה לא עבד.
 
טוב....../images/Emo26.gif

נסה להוסיף את השורה של ה-include. זה אומר לפתור לך גם את הקימפול וגם את הגרסאות. בלי קשר - הספר של O'Reilly הוא אחלה ספר. לגבי make - נסה man make...
 

selalerer

New member
איזה include??

הinclude שכתבתי
#include <linux/sched.h>​
כבר הכנסתי אותו ואז התחילו כל התקלות האלה. זה נתן לי הודעות בסגנון בקובץ BLA שמוכלל בקובץ BLABLA שמוכלל בsched.h יש תקלה כזאת וכזאת... ועדיין הוא לא זיהה לי את current. לא משנה אני עוד מעט יחבר את המחשב הזה לאינטרנט ואז אני יוכל לתת את ההודעות טעות המדוייקות ולהראות קוד במדוייק. זה יהיה יותר יעיל. סליחה על הבלבול שכל. אני אמשיך לקרוא את המדריך בינתיים בלי לנסות את הקוד. תודה רבה, סלע.
 
זה שבתשובה שלי - שתפתור לך הכל...

INCLUDEDIR = /usr/src/linux-2.4.20-8/include CFLAGS = -D__KERNEL__ -DMODULE -g -Wall -I$(INCLUDEDIR)​
הצעה: קרא שוב את התשובה שלי - תעשה מה שרשום שם ויהיה בסדר...
 

selalerer

New member
OK

אבל אני עדיין לא סגור על איך פועל הmakefile עשיתי man make ורשום שם באופן כללי על תפקיד הפקודה והדגלים אבל לא על ה"שפה" שאתה משתמש לכתוב את הmakefile אז אני יכול לכתוב מהדוגמא בספר על עיוור אבל הייתי מעדיף ללמוד מה קורה שם. יש איזה מקור מומלץ ללימוד?
 
למעלה