Whatsup - לינוקס, תוכנה חופשית וקוד פתוח בעברית

מילון מונחים/מושגים - מה ההבדל בין section לsegment וכיצד הוא מתבטא בזמן הריצה ?

Anonymous - 28/10/2009 - 19:12
נושא ההודעה: מה ההבדל בין section לsegment וכיצד הוא מתבטא בזמן הריצה ?
הבנתי שבתוך סגמנט יכולים להיות כמה סקשנים, האם זה נכון ?
מי משתמש בסגמנט (CS,DS,ES, וכ') ומי משתמש בסקשן ? (.text,.data,.code, כולם איפה נמצאים ? )

האם ld מתחשב בשניהם ?
מה קורה בזמן הרצת התכנית ? נבדקים הסגמנטים הבסיסיים ואז הסקשנים להרצה (אחרי שפורסים את הPE) ?
ik_5 - 28/10/2009 - 19:38
נושא ההודעה:
אם עושים סלט, אני מעדיף סלט ירקות.

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

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

PE זה פורט קובץ ריצה של Microsoft Windows. בהרבה מהיוניקסים קבצי הריצה הם קבצי ELF בכלל.

השוני בניהם זה הצורה שהם מתנהגים ושומרים את המידע בתוכם בצורה כזו שGAS (ושאר הפורמטים) יכולו לרוץ.

טוב זהו נגמרה ההפסקה חזרה לעבודה Smile
LemonLime - 28/10/2009 - 20:04
נושא ההודעה:
נראה לי ש-gas זה לא פורמט אלא קיצור של gnu assembler...

לפחות ב-elf, יש בקובץ הגדרה של פריסת התוכנה בזיכרון (שנעשית עם מערך של מבנים שנקראים segments, כשכל segment מגדיר מיפוי של חלק מהזיכרון ואיך לאתחל אותו עם נתונים מהקובץ), והגדרות על התפקיד והמבנה של חלקים בקובץ וב-image של התוכנה (אלה נקראים sections, כל section מגדיר מיקום של משהו, למשל יש אחד של קוד ואחד read only data ואחד מגדיר קישוריות לספריות חיצוניות וכו~)
נראה לי גם שיש דרישה ש-section אחד לא יתפרש על שניים או יותר segmentים, ככה שיוצא שכל segment מכיל section אחד או יותר~

בזמן הרצת התוכנית התוכנה נטענת לזיכרון לפי המיפויים שהוגדרו במערך ה-segmentים, נפתרות התלויות הדינמיות שהוגדרו ב-section המתאים (ותוך כדי כך נטענים עוד כמה ספריות שגם הן קבצי elf...), נקראים ה-constructors שהוגדרו ב-section שנקרא .ctors, אז מורצת הפונקציה main, אחריה ה-desctructors שהוגדרו ב-section שנקרא .dtors, ואז התוכנה משוחררת מהזיכרון~
(דילגתי על הרבה דברים, לא נורא~)
כל הזמנים הם GMT + 2 שעות