Modules and Drivers Flashcards

1
Q

מה קורה לאחר הדלקת המחשב?

A
  1. קוד ה-BIOS נטען לזיכרון והמעבד מתחיל להריץ אותו
  2. ה-BIOS טוען את הסקטור הראשון של הדיסק (MBR) לזיכרון
  3. קוד ה-MBR טוען את ה-boot loader
  4. ה-boot loader טוען את גרעין לינוקס
  5. גרעין לינוקס טוען את תהליך init ומריץ אותו
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

מהם תפקידי ה-BIOS?

A
  1. לזהות את התקני החומרה המחוברים למערכת.
  2. לבדוק שההתקנים הבסיסיים (מסך, מקלדת, …) פועלים בצורה תקינה.
  3. לעבור על רשימה מוגדרת מראש של התקנים, ולחפש התקן המאפשר אתחול (bootable device).
  4. אם לא נמצא אף התקן כזה, ה-BIOS רושם הודעת שגיאה למסך ומפסיק את תהליך האיתחול.
  5. אם נמצא התקן כזה, ה-BIOS טוען את הסקטור הראשון של ההתקן למקום קבוע בזיכרון.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

מה זה MBR (master boot record)?

A

אם הדיסק הוא התקן המאפשר אתחול (bootable device), אז הסקטור הראשון בדיסק נקרא MBR (master boot record).
ה-MBR מכיל קוד אסמבלי בסיסי המשמש לטעינת קוד נוסף: מנהל האתחול (boot loader).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

מה זה GRUB?

A

ה-boot loader של לינוקס

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

כיצד נטען גרעין לינוקס?

A
  1. GRUB טוען לזיכרון תמונה דחוסה של הגרעין, אשר נקראת בדרך כלל bzImage או vmlinuz, ואז מחלץ אותה.
  2. לצד תמונת הגרעין, GRUB טוען לזיכרון גם את מערכת הקבצים הראשונית: מערכת קבצים קטנה בשם initramfs או initrd.
  3. גרעין לינוקס מריץ את התוכנית /init מתוך מערכת הקבצים הראשונית.
    /init היא בדרך-כלל סקריפט shell.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

מה תפקידה של מערכת הקבצים הראשונית ומה עושה התוכנית init\?

A

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

התוכנית /init טוענת את הדרייברים הנחוצים ומרכיבה (mounts) את מערכת הקבצים האמיתית במקום מערכת הקבצים הראשונית.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

מה זה מודול?

A

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

מודול הוא ספריה משותפת (shared library) הנטענת (מקושרת) בזמן ריצה ופועלת במצב גרעין (כלומר CPL==0).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

למה משמשים מודולים?

A

מודולים משמשים בעיקר על מנת להוסיף תמיכה בהתקני חומרה (devices) ע”י דרייברים (drivers):

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

מי יכול להוסיף מודולים למערכת?

A

רק משתמש root.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

בעזרת איזו פקודה מוסיפים ומסירים מודולים?

A

הוספה - insmod

הסרה - rmmod

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

איך מעברים פרמטרים למודול?

A

Using the macro: module_param

example:
int iValue=0;   // 0 is the default value
char *sValue;
module_param(iValue, int, S_IRUGO);
module_param(sValue, charp, S_IRUGO);
then we can pass parameters during module insertion:
insmod ./params.ko iValue=3 sValue=“hello”
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

איך ניתן להעביר פרמטר אופציונלי למודול?

A

בעזרת מערך 0-1

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

מי התהליך שמריץ את טעינת המודול?

A

התהליך שמריץ את insmod (תהליך בן של shell).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

מהו דרייבר?

A

דרייבר הוא שכבת תוכנה החוצצת בין ההתקן לבין האפליקציה כדי לספק אבסטרקציה לפעולת ההתקן הספציפי.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

מהו התקן תוים ומהו התקן בלוקים?

A

התקן תווים
התקן שניגשים אליו כאל רצף של בתים.
לרוב משמשים להעברת מידע. לדוגמה: מסך, מקלדת.
בדרך כלל ניתן לגשת להתקן תווים רק באופן סדרתי (ולא אקראי).

התקן בלוקים
התקן שניתן לגשת אליו רק בכפולות של בלוק(למשל 512 בתים).
לרוב משמשים לאחסון מידע. לדוגמה: דיסק קשיח, דיסק נשלף (disk on key).
התקן בלוקים מאפשר גישה אקראית למידע שבו.
לינוקס מוסיפה שכבה נוספת (page cache) ומאפשרת לקרוא מהתקני בלוקים גם בתים בודדים.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

מהו מספר ראשים (major number) ומספר משני (minor number)?

A

התקן תווים מאופיין ע”י שני מספרים:
מספר ראשי (major number) – מזהה את הדרייבר המקושר להתקן.
מספר משני (minor number) – מזהה את ההתקן הספציפי המקושר לאותו דרייבר (יכולים להיות מספר התקנים, למשל מספר עכברים, המנוהלים ע”י אותו דרייבר).

כשמדפיסים את ההתקנים ע”י ls –l /dev
הראשי זה הראשון והמשני זה השני.

17
Q

מהם התקני תווים פיקטיביים ואילו יש?

A

לינוקס מספקת גם התקני תווים פיקטיביים שאינם קשורים לחומרה אמיתית, כולם בעלי מספר ראשי 1.

ראה טבלה בעמוד 30 של התרגול.

18
Q

איך ניתן ליצור התקן חדש?

A

בעזרת הקריאה mknod.

מקבלת כפרמטר שם, סוג מספר ראשי ומס’ משני

19
Q

כיצד ממומשות פעולות על התקנים שונים (הפעולות read, write,…) ומי מממש?

A

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

20
Q

אילו פונקציות חשובות יש ב-file_operations?

מה קורה כשהן מאותחלות ל-NULL?

A

open – מצביע לפונקציה לפתיחת ההתקן.
אם מאותחל ל-NULL, פעולת open() תמיד תצליח.

release – מצביע לפונקציה לשחרור ההתקן.
קריאת המערכת close() לא גוררת בהכרח קריאה ל-release(). אם ה-file object משותף (למשל, לאחר fork()), תתבצע קריאה
לrelease() רק לאחר שכל העותקים של ההתקן נסגרו.
אם מאותחל ל-NULL תמיד מצליח.

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

read – מצביע לפונקציה לקריאה מההתקן.
במידה ומאותחל ל-NULL, קריאת המערכת read תחזיר -EINVAL.

write – מצביע לפונקציה לכתיבה להתקן.
במידה ומאותחל ל-NULL, קריאת המערכת write תחזיר -EINVAL.

llseek – מצביע לפונקציה לשינוי המיקום הנוכחי בקובץ.
ישפיע על פעולות read/write.
מחזיר את המיקום החדש בקובץ.

ioctl – משמש להעברת פקודות ייחודיות להתקן. במידה ומאותחל ל-NULL, קריאת המערכת ioctl תחזיר -EINVAL.

21
Q

מה עושה קריאת המערכת ioctl? מהם הפרמטרים?

A

מאפשרת פקודות בקרה ייחודיות להתקן.
יש להשתמש באפשרות זאת רק אם לא ניתן לספק מענה הולם במסגרת הפונקציות הקיימות. לדוגמה: פקודת eject לכונן הדיסקים.

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

22
Q

כיצד מחברים דרייבר שתור מודול?

A

המודול ירשום את הדרייבר במהלך הטעינה שלו.
כלומר הפונקציה init_module() תקרא לפונקציה register_chrdev().
(הדבר רק מקשר דרייבר למספר ראשי, לא מתבצע קישור בפעול בין דרייבר להתקן).

המודול ימחק את הרישום בזמן הפריקה שלו.
כלומר הפונקציה cleanup_module() תקרא לפונקציה unregister_chrdev().

23
Q

כיצד מתבצע בפירוט תהליך רישום דרייבר?

A

הפונקציה register_chrdev() מכניסה למערך chrdevs במיקום של המס’ הראשי, מצביע ל-fops של ההתקן.
ב-fops יש מצביעים לפונקציות שבעצמם מצביעים לפונקציות בגרעין.

24
Q

איפה נשמרים כל הדרייברים?

A

במערך chdevs.

מכיל את שם הדרייבר ומצביע ל-fops.

25
Q

מה קורה כאשר מעבירים 0 גתור major num ל-register_chrdev?

A

מתבצעת הקצאה דינמית של מס’ ראשי לדרייבר.

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

26
Q

מהם שלבי הפונקציה sys_open()?

A
  1. ניגשת למערכת הקבצים וקוראת את המספר הראשי M והמשני m של ההתקן.
  2. בודקת כי הדרייבר של ההתקן רשום: במידה ו- chrdevs[M]==NULL, תוחזר שגיאה ENODEV.
  3. מאתחלת file objectחדש (נקרא לו filp) ומקצה כניסה חדשה ב-FDT שמצביעה עליו.
  4. מצביעה את filp->f_op לפונקציות של הדרייבר chrdevs[M]->f_op.
  5. במידה והפונקציה chrdevs[M]->f_op->open() אינה NULL, קוראת לה ומעבירה את filp כפרמטר.
    הפונקציה open() של הדרייבר תעדכן את filp->f_op כדי להגדיר התנהגות ספציפית להתקן – נראה בהמשך התרגול.
  6. לבסוף, מחזירה את ה-FD (הכניסה שהוקצתה עבור הקובץ ב-FDT).
27
Q

באיזה שדה בinode שמור המס’ הראשי והמשני של התקן?

A

i_rdev

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