מערכות הפעלה

33
הההההה ההההה ההההה10 הההה הההההה ההההההה-Linux Linux Device Drivers, 2 nd Edition Alessandro Rubini & Jonathan Corbet O’Reilly http:// www.xml.com/ldd/chapter/book /

Upload: dima

Post on 18-Mar-2016

68 views

Category:

Documents


2 download

DESCRIPTION

מערכות הפעלה. תרגול 10 – מבוא למנהלי התקנים ב- Linux. Linux Device Drivers, 2 nd Edition Alessandro Rubini & Jonathan Corbet O’Reilly http://www.xml.com/ldd/chapter/book/. תוכן התרגול. מבוא למנהלי התקנים ומודולים ב- Linux כתיבה והרצה של מודולים התקני תווים. מה זה מנהל התקן?. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: מערכות הפעלה

מערכות הפעלה

מבוא למנהלי התקנים ב – 10תרגול -LinuxLinux Device Drivers, 2nd EditionAlessandro Rubini & Jonathan CorbetO’Reillyhttp://www.xml.com/ldd/chapter/book/

Page 2: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 2(c) 2006 אריק פרידמן

תוכן התרגול

ב-ומודולים מנהלי התקניםמבוא לLinuxכתיבה והרצה של מודוליםהתקני תווים

Page 3: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 3(c) 2006 אריק פרידמן

מה זה מנהל התקן?שכבת תוכנה החוצצת בין החומרה לבין האפליקציה

מנהל ההתקן מחביא את הפרטים הנוגעים לפעולת החומרה המשתמש מבצע פעולות באמצעות אוסף פונקציות

סטנדרטי שאינו תלוי בהתקן מסוים תפקיד מנהל ההתקן למפות את הפונקציות הסטנדרטיות

לפעולות המבוצעות על התקן החומרה גישה מודולרית - ניתן לבנות מנהל התקן בנפרד משאר

הגרעין, ואז "לחבר" אותו בזמן ריצה, בשעת הצורך

Page 4: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 4(c) 2006 אריק פרידמן

Linuxמודולים ב--לLinux יש יכולת להרחיב בזמן ריצה את אוסף הפעולות

שמספק הגרעין מודולקטע קוד שניתן להוסיף לגרעין בזמן ריצה נקרא

ספריה משותפת הנטענת )מקושרת בזמן ריצה( לגרעיןרק משתמשים מורשים יכולים לטעון מודולים:ישנה חלוקה של מודולים לפי התפקודיות שהם מספקים

התקני תוויםהתקני בלוקיםממשקי רשת( ועודUSB, SCSI)...,

Page 5: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 5(c) 2006 אריק פרידמן

התקני תווים ובלוקים התקן תווים - התקן שניגשים אליו כאל רצף של בתים )כמו

קובץ(מסוף, פורט סדרתיבדרך כלל ניתן לגשת להתקן תווים רק באופן סדרתי

התקני בלוקים - התקן שניתן לתקשר איתו רק בכפולות של(KByteבלוק )למשל

בפועלLinuxמאפשרת לקרוא מהתקני בלוקים גם בתים בודדים משמשים, בין השאר, לייצג מערכות קבצים

( ניתן לגשת להתקנים אלו דרך מערכת הקבצים/dev)

Page 6: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 6(c) 2006 אריק פרידמן

ממשקי רשת התקנים המסוגלים להחליף מידע עם מחשבים

אחריםבאחריותם לשלוח ולקבל חבילות מידעאינם מיוצגים במערכת הקבצים

ישנן קריאות מערכת ייחודיות לטיפול בממשקי רשת

Page 7: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 7(c) 2006 אריק פרידמן

ענייני אבטחה-מודול רץ בkernel mode

גישה למבני הנתונים בגרעיןחשוב להימנע מחורי אבטחה במודול

למשלbuffer overrun-בתכנות ב cהקפדה על אתחול משתניםיש להתייחס לקלט משתמש בחשדנות במידת הצורך, הגבלת השימוש במודול למשתמשים

מורשים

Page 8: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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”);}

Page 9: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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>

Page 10: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 10(c) 2006 אריק פרידמן

העברת פרמטרים למודול

בעת טעינת המודול, ניתן להעביר אליו פרמטרים הנוגעיםלקונפיגורציה של המודול

:סוגי פרמטרים נתמכיםb – byte, h – short, i – integer, l – long, s – stringניתן להעביר גם מערך של פרמטרים

בקוד המודול מגדירים את המשתנים שיקבלו את הפרמטריםMODULE_PARMבאמצעות המאקרו

המאקרו צריך להופיע מחוץ לפונקציה. בד"כ ממוקם בתחילת המודולפרמטר ראשון – משתנה הפרמטר, פרמטר שני – סוג הפרמטריש להגדיר לכל פרמטר ערך ברירת מחדל

ניתן להשתמש במאקרוMODULE_PARM_DESC כדי להוסיף תיאור לפרמטר

אפשר גם עם( כלי ניהול אוטומטיים יכולים לקרוא את התיאורmodinfo)

Page 11: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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

Page 12: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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;}…

Page 13: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 13(c) 2006 אריק פרידמן

התקני תווים - איך זה עובד?המודול Linuxגרעין

insmod

rmmod

init_module)(

cleanup_module)(

register_chrdev)(

unregister_chrdev)(

chrdevs][

fops

אוסף פונקציות

פונקציותאחרותבגרעין

קריאה לפונקציהפעולת השמה

מצביע לפונקציהמצביע לנתונים

Page 14: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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

Page 15: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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.

Page 16: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 16(c) 2006 אריק פרידמן

בחירת מספר ראשי של 2.4גרסה Linux-מספרים ראשיים256 תומכת ב

שמורים לשימוש עתידי255 ו-0המספרים חלק מהמספרים הראשיים מוקצים באופן סטטי להתקנים

נפוצים הקצאה סטטית של מספרים ראשיים עבור כל התקן יכולה

להיות בעייתיתהתנגשות בין מספרים ראשיים של התקנים שונים

0ניתן לבצע הקצאה דינמית של מספר ראשי ע"י העברת ערך majorעבור הפרמטר

מערכת ההפעלה בוחרת מספר פנוי ומחזירה אותו כתוצאה שלregister_chrdev)(

0במקרה של הקצאה סטטית ערך החזרה יהיה-ניתן לראות את המספר שהוקצה גם ב/proc/devices

Page 17: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 17(c) 2006 אריק פרידמן

הסרת מנהל התקן מהמערכת כאשר מסירים מנהל התקן, יש לשחרר את המספר הראשי

, )(unregister_chrdevשהוקצה לו, באמצעות הפונקציה <linux/fs.h>המוגדרת ב-

:תחבירint unregister_chrdev(unsigned int major,

const char *name);:פרמטרים

majorהמספר הראשי של מנהל ההתקן אותו רוצים להסיר – name-שם ההתקן, כפי שמופיע ב – /proc/devices

:או חיובי, אחרת 0 במקרה של הצלחה יוחזר ערך ערך מוחזר -1.

Page 18: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 18(c) 2006 אריק פרידמן

יצירת התקן חדש-הקריאה לregister_chrdev רק מקשרת בין מנהל התקן לבין

מספר ראשי ,כדי לעבוד עם ההתקן, יש ליצור קובץ חדש שייצג אותו

(superuser)דורש הרשאות mknodבאמצעות הפקודה :תחביר

mknod NAME TYPE MAJOR MINOR:פרמטרים

NAME)שם הקובץ החדש )שייצג את ההתקן – TYPE ( סוג ההתקן –c ,התקן תווים – b)התקן בלוקים – MAJOR)המספר הראשי של ההתקן )למעשה קובע את מנהל ההתקן –MINOR (255 ל-0– המספר המשני של ההתקן )מספר בין

( ניתן להסיר התקן באופן דומה למחיקת קובץrm)

Page 19: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 19(c) 2006 אריק פרידמן

זיהוי התקן ע"י מנהל ההתקן קבצים מיוצגים ע"י מבנה נתונים בשםinode פרטים(

נוספים בתרגול על מערכות קבצים(. בפרט, גם להתקן תווים ישinode.המייצג אותו

בכל פעם שמבצעים פעולה על התקן, מנהל ההתקן המתאים.inodeמקבל כפרמטר את ה-

השדהi_rdev-ב inode מכיל את המספר הראשי והמשני של ההתקן.

המאקרוMAJOR)inode-<i_rdev(מחזיר את המספר הראשי המאקרוMINOR)inode-<i_rdev(מחזיר את המספר המשני

Page 20: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 20(c) 2006 אריק פרידמן

פעולות על התקןמערכת ההפעלה מגדירה אוסף פעולות שניתן לבצע על קבצים

בפרט זהו גם אוסף הפעולות שניתן לבצע על התקן תוויםניתן להפעיל את הפעולות באמצעות קריאות מערכת

מבנה הנתוניםfile_operations הוא מערך של מצביעי הפונקציות המממשות את אותן הפעולות

-מוגדר ב<linux/fs.h> משתנה המצביע למבנה הנ"ל מכונה בד"כfops או f_op מצביעNULLמייצג פונקציה לא ממומשת, או מימוש ברירת מחדל

גישה מונחית אובייקטיםהקובץ הוא האובייקט-המתודות של האובייקט מוגדרות ע"י אוסף הפונקציות בfops

Page 21: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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;

Page 22: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 22(c) 2006 אריק פרידמן

file operationsאתחול לצורך תאימות גדולה יותר בין גרסאות שונות, הוגדר תחביר

(tagged” initialization"מיוחד לאתחול: אתחול עם תוויות ) הרחבה יחודית למהדר שלGNU

struct file_operations my_fops = { .llseek=my_llseek, .read=my_read, .write=my_write, …

}; אתחול שדהowner-נעשה ע"י המאקרו הבא ב init_module:

SET_MODULE_OWNER(&fops);

Page 23: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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

Page 24: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 24(c) 2006 אריק פרידמן

פתיחת התקן

קריאת המערכת( כאשר פותחים התקןopen בין השאר ,)מערכת ההפעלה מבצעת את הפעולות הבאות:

מאתחלת מבנה נתונים מסוגstruct fileמבנה נתונים זה מייצג קובץ/התקן פתוח משתנה המצביע למבנה הנ"ל מכונה בד"כfile או filp כל הקריאות שהמשתמש מבצע עלfile descriptor מסויים, יועברו למנהל

struct fileההתקן עם אותו במידה והפונקציהopen אותחלה עבור מנהל ההתקן, מערכת

ההפעלה קוראת לה ומעבירה את מבנה הנתונים כפרמטר

Page 25: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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;

Page 26: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 26(c) 2006 אריק פרידמן

(2פתיחת התקן )

הפונקציהopen:של מנהל ההתקן אחראית ל הגדלת מונה השימוש של מנהל ההתקן )מתבצע

ומעלה(2.4אוטומטית בגרסאות )לבדוק שההתקן תקין )אין בעיות חומרה לאתחל את ההתקן, אם זו הפעם הראשונה

שפותחים אותו לזהות את המספר המשני, לעדכן אתf_opאם צריך -לאתחל מבני נתונים בfilp-<private_data

Page 27: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 27(c) 2006 אריק פרידמן

סגירת התקן

הפונקציהrelease:של מנהל ההתקן אחראית ל הקטנת מונה השימוש של מנהל ההתקן )מתבצע

ומעלה(2.4אוטומטית בגרסאות -שחרור מבני נתונים בfilp-<private_dataאם צריך ,

פעולת סגירה מתבצעת גם אם האפליקציה לאסגרה קבצים פתוחים באופן מפורש

כאשר תהליך מבצעexit מערכת ההפעלה תפעיל את עבור כל קובץ פתוח.closeקריאת המערכת

Page 28: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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אחרת ערך שלילי. הפרמטר

החדש בקובץ

Page 29: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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(

Page 30: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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

Page 31: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 31(c) 2006 אריק פרידמן

)ioctl )2הפונקציה בצד המשתמש, לקריאת המערכתioctlיש מבנה ייחודי :תחביר

int ioctl(int fd,int cmd,…);:פרמטרים

fd שהתקבל כתוצאה של( מתאר קובץ – open)cmd)מספר סידורי של פקודה )יועבר כמו שהוא לפונקציה המממשת – …נועד למנוע בדיקה של המהדר על הפרמטר האופציונלי –

-בדרך כלל מתייחסים לפרמטר האופציונלי כchar *argp:(1- תלוי בכותב מנהל ההתקן )שגיאה – ערך ערך מוחזר

Page 32: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 32(c) 2006 אריק פרידמן

)ioctl )3הפונקציה עדיף שהתקנים שונים יגדירו קבועים שונים עבור הפרמטרcmd

התקנים שונים עושים שימוש באותם מספרים - פתח לתקלותמוסכמה לקביעת המספרים על סמך ארבעה פרמטרים

type( 8 – מספר "קסם", רצוי ייחודי להתקן)ביטים :הנחיות לבחירת המספרDocumentation/ioctl-number.txt

number( 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)

Page 33: מערכות הפעלה

מבוא למנהלי התקנים – 10תרגול Linux-ב 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)