מערכות הפעלה
DESCRIPTION
מערכות הפעלה. תרגול 11 – מבוא למנהלי התקנים ב- Linux. Linux Device Drivers, 2 nd Edition Alessandro Rubini & Jonathan Corbet O’Reilly http://www.xml.com/ldd/chapter/book/. תוכן התרגול. מבוא למנהלי התקנים ומודולים ב- Linux כתיבה והרצה של מודולים התקני תווים. מה זה מנהל התקן?. - PowerPoint PPT PresentationTRANSCRIPT
מערכות הפעלה
מבוא למנהלי התקנים ב – 11תרגול -Linux
Linux Device Drivers, 2nd EditionAlessandro Rubini & Jonathan CorbetO’Reillyhttp://www.xml.com/ldd/chapter/book/
מערכות הפעלה - תרגול 11 2(c) 2006 אריק פרידמן
תוכן התרגול
ב-ומודולים מנהלי התקניםמבוא לLinuxכתיבה והרצה של מודוליםהתקני תווים
מערכות הפעלה - תרגול 11 3(c) 2006 אריק פרידמן
מה זה מנהל התקן?
שכבת תוכנה החוצצת בין החומרה לבין האפליקציה מנהל ההתקן מחביא את הפרטים הנוגעים לפעולת
החומרה המשתמש מבצע פעולות באמצעות אוסף פונקציות
סטנדרטי שאינו תלוי בהתקן מסוים תפקיד מנהל ההתקן למפות את הפונקציות הסטנדרטיות
לפעולות המבוצעות על התקן החומרה
גישה מודולרית - ניתן לבנות מנהל התקן בנפרדמשאר הגרעין, ואז "לחבר" אותו בזמן ריצה, בשעת
הצורך
מערכות הפעלה - תרגול 11 4(c) 2006 אריק פרידמן
Linuxמודולים ב--לLinux יש יכולת להרחיב בזמן ריצה את אוסף הפעולות
שמספק הגרעין מודולקטע קוד שניתן להוסיף לגרעין בזמן ריצה נקרא
ספריה משותפת הנטענת )מקושרת בזמן ריצה( לגרעיןרק משתמשים מורשים יכולים לטעון מודולים:ישנה חלוקה של מודולים לפי התפקודיות שהם מספקים
התקני תוויםהתקני בלוקיםממשקי רשת( ועודUSB, SCSI)...,
מערכות הפעלה - תרגול 11 5(c) 2006 אריק פרידמן
התקני תווים ובלוקים
התקן תווים - התקן שניגשים אליו כאל רצף של בתים)כמו קובץ(
מסוף, פורט סדרתיבדרך כלל ניתן לגשת להתקן תווים רק באופן סדרתי
התקני בלוקים - התקן שניתן לתקשר איתו רק בכפולות(KByteשל בלוק )למשל
בפועלLinux מאפשרת לקרוא מהתקני בלוקים גם בתים בודדים
משמשים, בין השאר, לייצג מערכות קבצים( ניתן לגשת להתקנים אלו דרך מערכת הקבצים/dev)
מערכות הפעלה - תרגול 11 6(c) 2006 אריק פרידמן
ממשקי רשת
התקנים המסוגלים להחליף מידע עם מחשביםאחרים
באחריותם לשלוח ולקבל חבילות מידעאינם מיוצגים במערכת הקבצים
ישנן קריאות מערכת ייחודיות לטיפול בממשקי רשת
מערכות הפעלה - תרגול 11 7(c) 2006 אריק פרידמן
ענייני אבטחה
-מודול רץ בkernel modeגישה למבני הנתונים בגרעין
חשוב להימנע מחורי אבטחה במודול למשלbuffer overrun-בתכנות ב c
הקפדה על אתחול משתניםיש להתייחס לקלט משתמש בחשדנות במידת הצורך, הגבלת השימוש במודול למשתמשים
מורשים
מערכות הפעלה - תרגול 11 8(c) 2006 אריק פרידמן
מודול ראשון#include <linux/module.h>#include <linux/kernel.h> /* for using printk */MODULE_LICENSE(“GPL”);
int init_module(void) {
printk(“Hello, World\n”); return 0;
}
void cleanup_module(void) {
printk(“Goodbye cruel world\n”);}
מערכות הפעלה - תרגול 11 9(c) 2006 אריק פרידמן
הפעלת המודול
קובץmakefile:לדוגמה KERNELDIR = /usr/src/linux-2.4.18-14custominclude $(KERNELDIR)/.configCFLAGS = -D__KERNEL__ -DMODULE –I$(KERNELDIR)/include
–O -Wallall: hello.o
:הרצה> make> insmod ./hello.oHello, world> rmmod helloGoodBye cruel world>
מערכות הפעלה - תרגול 11 10(c) 2006 אריק פרידמן
העברת פרמטרים למודול
בעת טעינת המודול, ניתן להעביר אליו פרמטרים הנוגעיםלקונפיגורציה של המודול
:סוגי פרמטרים נתמכיםb – byte, h – short, i – integer, l – long, s – stringניתן להעביר גם מערך של פרמטרים
בקוד המודול מגדירים את המשתנים שיקבלו את הפרמטריםMODULE_PARMבאמצעות המאקרו
המאקרו צריך להופיע מחוץ לפונקציה. בד"כ ממוקם בתחילת המודולפרמטר ראשון – משתנה הפרמטר, פרמטר שני – סוג הפרמטריש להגדיר לכל פרמטר ערך ברירת מחדל
ניתן להשתמש במאקרוMODULE_PARM_DESC כדי להוסיף תיאור לפרמטר
אפשר גם עם( כלי ניהול אוטומטיים יכולים לקרוא את התיאורmodinfo)
מערכות הפעלה - תרגול 11 11(c) 2006 אריק פרידמן
(2העברת פרמטרים למודול )
( הגדרת הפרמטרים במודולparams.c:)למשל ,int iValue=0;char *strValue;int iArray[4];MODULE_PARM(iValue,”i”);MODULE_PARM(strValue,”s”);MODULE_PARM(iArray,”4i”);
:העברת פרמטרים בטעינת המודול> insmod ./params.o iValue=3 sValue=“hello”
iArray=1,2,3,4
מערכות הפעלה - תרגול 11 12(c) 2006 אריק פרידמן
גישה לנתוני גרעיןלמודול יש גישה למבני הנתונים של הגרעין
ישנם חלקים בגרעין הזמינים רק אחרי הוספת#define __KERNEL__-מופיע בmakefile
צריך להוסיף#includeלקבצים המתאימים …#include <linux/sched.h>
int init_module(void){
printk(“The process is \”%s\” (pid %i)\n”,current->comm, current->pid);
return 0;}…
מערכות הפעלה - תרגול 11 13(c) 2006 אריק פרידמן
התקני תווים - איך זה עובד?המודול Linuxגרעין
insmod
rmmod
init_module)(
cleanup_module)(
register_chrdev)(
unregister_chrdev)(
chrdevs][
fops
אוסף פונקציות
פונקציותאחרותבגרעין
קריאה לפונקציהפעולת השמה
מצביע לפונקציהמצביע לנתונים
מערכות הפעלה - תרגול 11 14(c) 2006 אריק פרידמן
התקני תוויםלהתקני תווים ניגשים דרך שמות המופיעים במערכת הקבצים
בדרך כלל ממוקמים במדריך/dev כאשר מבצעיםls –l התקני תווים מאופיינים בתו ,cבעמודה הראשונה
:התקן תווים מאופיין ע"י שני מספרים( מספר ראשיmajor number) מזהה את מנהל ההתקן המקושר -
להתקן( מספר משניminor number) מספר שמשמש את מנהל ההתקן –
כדי להבחין בין התקנים שונים המחוברים אליוcrw-rw-rw- 1 root root 1, 3 Aug 31 2002 nullcrw------- 1 root root 10, 1 May 12 2003 psauxcrw------- 1 root tty 4, 1 May 12 10:33 tty1crw-rw-rw- 1 root root 1, 5 Aug 31 2002 zero
מערכות הפעלה - תרגול 11 15(c) 2006 אריק פרידמן
הוספת מנהל התקן חדשכדי ליצור מנהל התקן חדש, יש להקצות לו מספר ראשי חדש
מבוצע ע"י הפונקציהregister_chrdev)(-המוגדרת ב ,<linux/fs.h>( ההקצאה מבוצעת במסגרת אתחול מנהל ההתקןinit_module)()
:תחבירint register_chrdev(unsigned int major,
const char *name, struct file_operations *fops);:פרמטרים
majorהמספר הראשי אותו רוצים להקצות למנהל ההתקן – name-שם ההתקן, כפי שיופיע ב – /proc/devicesfops .מערך של מצביעי פונקציות, המממשים את פעולת ההתקן –
נרחיב עליו בהמשך:או חיובי, אחרת 0 במקרה של הצלחה יוחזר ערך ערך מוחזר -
1.
מערכות הפעלה - תרגול 11 16(c) 2006 אריק פרידמן
בחירת מספר ראשי של 2.4גרסה Linux-מספרים ראשיים256 תומכת ב
שמורים לשימוש עתידי255 ו-0המספרים חלק מהמספרים הראשיים מוקצים באופן סטטי להתקנים
נפוצים הקצאה סטטית של מספרים ראשיים עבור כל התקן יכולה
להיות בעייתיתהתנגשות בין מספרים ראשיים של התקנים שונים
0ניתן לבצע הקצאה דינמית של מספר ראשי ע"י העברת ערך majorעבור הפרמטר
מערכת ההפעלה בוחרת מספר פנוי ומחזירה אותו כתוצאה שלregister_chrdev)(
0במקרה של הקצאה סטטית ערך החזרה יהיה-ניתן לראות את המספר שהוקצה גם ב/proc/devices
מערכות הפעלה - תרגול 11 17(c) 2006 אריק פרידמן
הסרת מנהל התקן מהמערכת
כאשר מסירים מנהל התקן, יש לשחרר את המספר הראשי, )(unregister_chrdevשהוקצה לו, באמצעות הפונקציה
<linux/fs.h>המוגדרת ב-:תחביר
int unregister_chrdev(unsigned int major, const char *name);
:פרמטריםmajorהמספר הראשי של מנהל ההתקן אותו רוצים להסיר – name-שם ההתקן, כפי שמופיע ב – /proc/devices
:או חיובי, אחרת 0 במקרה של הצלחה יוחזר ערך ערך מוחזר -1.
מערכות הפעלה - תרגול 11 18(c) 2006 אריק פרידמן
יצירת התקן חדש-הקריאה לregister_chrdev רק מקשרת בין מנהל התקן לבין
מספר ראשי ,כדי לעבוד עם ההתקן, יש ליצור קובץ חדש שייצג אותו
(superuser)דורש הרשאות mknodבאמצעות הפקודה :תחביר
mknod NAME TYPE MAJOR MINOR:פרמטרים
NAME)שם הקובץ החדש )שייצג את ההתקן – TYPE ( סוג ההתקן –c ,התקן תווים – b)התקן בלוקים – MAJOR המספר הראשי של ההתקן )למעשה קובע את מנהל –
ההתקן(MINOR (255 ל-0– המספר המשני של ההתקן )מספר בין
( ניתן להסיר התקן באופן דומה למחיקת קובץrm)
מערכות הפעלה - תרגול 11 19(c) 2006 אריק פרידמן
זיהוי התקן ע"י מנהל ההתקן
קבצים מיוצגים ע"י מבנה נתונים בשםinode פרטים( נוספים בתרגול על מערכות קבצים(.
בפרט, גם להתקן תווים ישinode.המייצג אותו בכל פעם שמבצעים פעולה על התקן, מנהל ההתקן
המתאים.inodeמקבל כפרמטר את ה- השדהi_rdev-ב inode מכיל את המספר הראשי
והמשני של ההתקן. המאקרוMAJOR)inode-<i_rdev(מחזיר את המספר הראשי המאקרוMINOR)inode-<i_rdev(מחזיר את המספר המשני
מערכות הפעלה - תרגול 11 20(c) 2006 אריק פרידמן
פעולות על התקן
מערכת ההפעלה מגדירה אוסף פעולות שניתן לבצע עלקבצים
בפרט זהו גם אוסף הפעולות שניתן לבצע על התקן תוויםניתן להפעיל את הפעולות באמצעות קריאות מערכת
מבנה הנתוניםfile_operations הוא מערך של מצביעי הפונקציות המממשות את אותן הפעולות
-מוגדר ב<linux/fs.h> משתנה המצביע למבנה הנ"ל מכונה בד"כfops או f_op מצביעNULLמייצג פונקציה לא ממומשת, או מימוש ברירת מחדל
גישה מונחית אובייקטיםהקובץ הוא האובייקט-המתודות של האובייקט מוגדרות ע"י אוסף הפונקציות בfops
מערכות הפעלה - תרגול 11 21(c) 2006 אריק פרידמן
file operationsשדות חשובים ב-
int (*open) (struct inode *, struct file *);int (*release) (struct inode *,
struct file *);int (*flush) (struct file *);ssize_t (*read) (struct file *, char *, size_t, loff_t *);
ssize_t (*write) (struct file *, const char *, size_t, loff_t *);
loff_t (*llseek) (struct file *, loff_t, int);int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
struct module *owner;
מערכות הפעלה - תרגול 11 22(c) 2006 אריק פרידמן
file operationsאתחול
לצורך תאימות גדולה יותר בין גרסאות שונות, הוגדר תחביר(tagged” initialization"מיוחד לאתחול: אתחול עם תוויות )
הרחבה יחודית למהדר שלGNUstruct file_operations my_fops = {
.llseek=my_llseek, .read=my_read, .write=my_write, …
}; אתחול שדהowner-נעשה ע"י המאקרו הבא ב init_module:
SET_MODULE_OWNER(&fops);
מערכות הפעלה - תרגול 11 23(c) 2006 אריק פרידמן
איפה אנחנו עומדים בינתיים
crw-r--r-- 1 root root 254, 0 May 17 2006 /dev/mycdev0crw-r--r-- 1 root root 254, 1 May 17 2006 /dev/mycdev1
major number minor number
mycdev
קבצי התקן:
מנהל התקן:
openreleasereadwrite…owner
fops
מערכות הפעלה - תרגול 11 24(c) 2006 אריק פרידמן
פתיחת התקן
קריאת המערכת( כאשר פותחים התקןopen בין השאר ,)מערכת ההפעלה מבצעת את הפעולות הבאות:
מאתחלת מבנה נתונים מסוגstruct fileמבנה נתונים זה מייצג קובץ/התקן פתוח משתנה המצביע למבנה הנ"ל מכונה בד"כfile או filp כל הקריאות שהמשתמש מבצע עלfile descriptor מסויים, יועברו
struct fileלמנהל ההתקן עם אותו
במידה והפונקציהopen אותחלה עבור מנהל ההתקן, מערכת ההפעלה קוראת לה ומעבירה את מבנה הנתונים כפרמטר
מערכות הפעלה - תרגול 11 25(c) 2006 אריק פרידמן
struct fileשדות חשובים ב-
mode_t f_mode; /* (FMODE_READ, FMODE_WRITE) */
loff_t f_pos;unsigned int f_flags;/* (O_RDONLY, O_NONBLOCK,…, see >linux/fcntl.h<) */
struct file_operations *f_op;void *private_data;
מערכות הפעלה - תרגול 11 26(c) 2006 אריק פרידמן
(2פתיחת התקן )
הפונקציהopen:של מנהל ההתקן אחראית ל הגדלת מונה השימוש של מנהל ההתקן )מתבצע
ומעלה(2.4אוטומטית בגרסאות )לבדוק שההתקן תקין )אין בעיות חומרה לאתחל את ההתקן, אם זו הפעם הראשונה
שפותחים אותו לזהות את המספר המשני, לעדכן אתf_op אם
צריך-לאתחל מבני נתונים בfilp-<private_data
מערכות הפעלה - תרגול 11 27(c) 2006 אריק פרידמן
סגירת התקן
הפונקציהrelease:של מנהל ההתקן אחראית ל הקטנת מונה השימוש של מנהל ההתקן )מתבצע
ומעלה(2.4אוטומטית בגרסאות -שחרור מבני נתונים בfilp-<private_dataאם צריך ,
פעולת סגירה מתבצעת גם אם האפליקציה לאסגרה קבצים פתוחים באופן מפורש
כאשר תהליך מבצעexit מערכת ההפעלה תפעיל עבור כל קובץ פתוח.closeאת קריאת המערכת
מערכות הפעלה - תרגול 11 28(c) 2006 אריק פרידמן
write ו-readהפונקציות
:תחבירssize_t read(struct file *filp, char *buff, size_t
count, loff_t *offp);ssize_t write(struct file *filp, const char *buff,
size_t count, loff_t *offp);:פרמטרים
filpמבנה הנתונים המייצג את הקובץ )ההתקן( הפתוח – buff)חוצץ באזור הזכרון של המשתמש )מקור לקריאה/יעד לכתיבה – countמספר הבתים שיש לקרוא/לכתוב – offpמצביע המייצג את המיקום שאליו המשתמש ניגש בקובץ –
:במקרה של הצלחה יוחזר מספר הבתים שהועתקו, ערך מוחזר מעודכן כדי לבטא את המיקום offpאחרת ערך שלילי. הפרמטר
החדש בקובץ
מערכות הפעלה - תרגול 11 29(c) 2006 אריק פרידמן
)write )2 ו-readהפונקציות
ברוב המקרים נדרש להעתיק מידע בין אזור הזכרון שלהמשתמש ואזור הזכרון של הגרעין. לרוב מתבצע באמצעות:
unsigned long copy_to_user(void *to, const void *from, unsigned long count);
unsigned long copy_from_user(void *to, const void *from, unsigned long count);
-מוגדרות ב<asm/uaccess.h>הפונקציות מוודאות כי הגישה מתבצעת לאזורים חוקיים בזכרון
במידה ולא, לא מתבצעת כל העתקה אם ההעתקה 0להעתקה )שנותרו בכל מקרה, מוחזר מספר הבתים
הצליחה( ניתן להקצות ולשחרר זכרון בגרעין באמצעותkmalloc-ו kfree
-זהות לmalloc-ו free למעט פרמטר נוסף של ,kmalloc )GFP_USER, GFP_KERNEL(
מערכות הפעלה - תרגול 11 30(c) 2006 אריק פרידמן
ioctlהפונקציה
מטרתה לאפשר פקודות בקרה ייחודיות להתקן יש להשתמש באפשרות זאת רק אם לא ניתן לספק מענה הולם במסגרת
הפונקציות הקיימות:תחביר
int (*ioctl)(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg);
:פרמטריםinode-אובייקט ה – inodeהמייצג את הקובץ filpמבנה הנתונים המייצג את הקובץ הפתוח – cmd)מספר סידורי של פקודה )על מנת לתמוך במספר פקודות בקרה –
בדרך כלל משתמשים בקובץheaderכדי להגדיר שמות לפקודות arg)פרמטר כללי אופציונלי )אם המשתמש לא מעביר אותו, יהיה ערך זבל –
:תלוי בכותב מנהל ההתקן )שגיאה – ערך שלילי(ערך מוחזר בדרך כלל לפונקציה יהיה מבנהswitch בהתאם לפרמטר ,cmd
מערכות הפעלה - תרגול 11 31(c) 2006 אריק פרידמן
)ioctl )2הפונקציה
בצד המשתמש, לקריאת המערכתioctlיש מבנה ייחודי :תחביר
int ioctl(int fd,int cmd,…);:פרמטרים
fd שהתקבל כתוצאה של( מתאר קובץ – open)cmd)מספר סידורי של פקודה )יועבר כמו שהוא לפונקציה המממשת – …נועד למנוע בדיקה של המהדר על הפרמטר האופציונלי –
-בדרך כלל מתייחסים לפרמטר האופציונלי כchar *argp:(1- תלוי בכותב מנהל ההתקן )שגיאה – ערך ערך מוחזר
מערכות הפעלה - תרגול 11 32(c) 2006 אריק פרידמן
)ioctl )3הפונקציה
עדיף שהתקנים שונים יגדירו קבועים שונים עבור הפרמטרcmdהתקנים שונים עושים שימוש באותם מספרים - פתח לתקלות
מוסכמה לקביעת המספרים על סמך ארבעה פרמטריםtype( 8 – מספר "קסם", רצוי ייחודי להתקן)ביטים
:הנחיות לבחירת המספרDocumentation/ioctl-number.txtnumber( 8 – מספר סידורי)ביטים directionהמידע )מנקודת המבט של המשתמש( – כיוון העברת
_IOC_NONE , _IOC_READ , _IOC_WRITE, _IOC_READ | _IOC_WRITE
size( 8-14 – גודל מידע המשתמש המעורב בהעברה)ביטים הקובץ<asm/ioctl.h>מגדיר פונקציות מאקרו לקביעת המספרים
( ישנה פקודת מאקרו לכל כיווןdirection:של העברה )_IO(type,nr) , _IOR(type,nr,dataitem)_IOW(type,nr,dataitem) , _IOWR(type,nr,dataitem)
מערכות הפעלה - תרגול 11 33(c) 2006 אריק פרידמן
)ioctl )4הפונקציה
:דוגמה#define MYDEV_IOC_MAGIC ‘o’
#DEFINE MYDEV_IORESET _IO(MYDEV_IOC_MAGIC,0)#DEFINE MYDEV_SETMODE _IOW(MYDEV_IOC_MAGIC,1,char) #DEFINE MYDEV_GETMODE _IOR(MYDEV_IOC_MAGIC,2,char)