למה צריך kernel stack?

  • פותח הנושא ג81
  • פורסם בתאריך

ג81

New member
למה צריך kernel stack?

ב-user stack נשמרים המשתנים הלוקליים וכתובות חזרה לפונקציה. איפה משתמשים ב-kernel stack?
 

yoniBLA

New member
אתה שוכח שבמרחב הזיכרון

יש עוד דברים מלבד הקוד שאתה כתבת. אתה משתמש בספריות כשאתה כותב קוד, ומדי פעם הקוד דורש לבצע פעולות ב"kernel mode" (בקריאה לsyscalls). חייבת להיות הפרדה בין הkernel mode לuser mode מכיון שההרשאות בהם שונות.
 

ג81

New member
אז אתה אומר שה-kernel stack

הוא מחסנית שמשמשת לשמירת המשתנים הלוקליים של system calls?
 

yoniBLA

New member
לא,

נשמרים שם בין השאר משתנים שמשמשים את הדרייבר שדואג לפתוח קבצים כשאתה קורא לopen() - כיון שהוא רץ בkernel mode. חייבת להיות הפרדה מוחלטת בין קוד שרץ בuserland לבין קוד שרץ בkernel mode. אסור לקוד בuserland להשפיע בכל צורה על הקוד שרץ בkernel mode. אם לא הייתה לקרנל מחסנית משלו, יכולת לגשת למחסנית הזאת מuserland ובכך להשפיע על הקוד שרץ בקרנל. אתה מכיר את הנושא של syscalls? האופן בו נעשה המעבר מuserland לkernel? אם לא, אני מציע לך לקרוא על הנושא, חפש בוויקיפדיה ring 0 ו syscall.
 

ג81

New member
הדרייבר שפותח את הקבצים

הוא סוג של system call, לא? אני יודע פחות או יותר מה זה system call וגם קראתי על זה עכשיו בויקיפדיה.
 

yoniBLA

New member
לא,

system call זה מושג בעל משמעות מאד מפורשת - זו קריאה שמתבצעת מuserland לפונקציית kernel. דרייבר לצורך העניין יכול להיות אוסף של פונקציות קרנל, שאולי ניתן לקרוא לאחת מהן בעזרת syscall (כנראה שלא, ישנה שכבת קרנל מעל הדרייבר שעוטפת אותו - הsyscall קורא לפונקציה בשכבה הזאת והיא קוראת לפונקציות של הדרייבר). דוגמה לsyscall בלינוקס - מעבירים את מספר הsyscall הרצוי לEAX (נניח 5 בשביל open), מבצעים int 0x80, הקרנל תופס את הinterrupt, דרך הinterrupt table הוא מגלה ש0x80 זה interrupt שנועד להודיע על syscall, הוא קורא לפונקציה לטיפול בsyscalls עם הפרמטר 5 - הפונקציה יודעת ש5 זה open וקוראת לפונקצייה של איזה דרייבר שפותח את הקובץ.
 

ג81

New member
ואם בזמן ריצתו של תהליך כלשהו

מתבצעת למשל פסיקת שעון שקוראת לשיגרת פסיקה, אז אם השיגרה הזאת צריכה לשמור משתנים, היא שומרת אותם ב-kernel stack של אותו תהליך?
 
למעלה