טבלת מקטעים כללית
טבלת המקטעים הכללית (באנגלית: Global Descriptor Table, או בקיצור GDT ) היא מבנה נתונים המשמש מעבדים ממשפחת Intel x86 (החל מ־Intel 80286 (אנ')) ומגדירה תכונות ומאפיינים של מקטעי זיכרון שונים, כמו כתובת הבסיס של המקטע, גודל המקטע, הרשאות של המקטע ועוד. ה-GDT מהווה את אחד ההבדלים העיקריים בין Protected mode (אנ') ל-Real mode (אנ'), בעודה מאפשרת להגדיר הגבלות גישה לאזורים מסוימים בזיכרון.[1]
תיאור[עריכת קוד מקור | עריכה]
ה-GDT היא טבלה (מערך), שכל תא בו הוא בגודל 8 בתים. כל ערך בטבלה מתייחס למקטע אחר בזיכרון (מתאר מקטע (אנ')), ל-Task state segment (אנ') (מבנה שמחזיק מידע על משימה (task (אנ')) ספציפית), ל-Call gate (אנ'), או לטבלת מקטעים מקומית (אנ').
כל תא בטבלת המקטעים הוא כאמור בגודל של 8 בתים, וכולל בתוכו את השדות הבאים:
- כתובת הבסיס של מקטע הזיכרון
- כתובת הגבול של מקטע הזיכרון, שממנה ניתן להסיק על גודל הזיכרון
- הרשאות המקטע
- control bits
האוגר GDTR מאחסן כתובת שבה נשמר מידע על טבלת המקטעים הכללית - הגודל שלה, והכתובת שלה בזיכרון. ניתן לשנות את ערכו באמצעות הפקודה LGDT.
מבנה[עריכת קוד מקור | עריכה]
x86-64[עריכת קוד מקור | עריכה]
המבנה של כל תא ב-GDT במערכת הפעלה עם ארכיטקטורת x86-64 הוא קבוע, והגודל שלו הוא 64 סיביות. מתאר המקטע כולל את השדות הבאים:
- כתובת בסיס (Base Address) - הכתובת שבה מתחיל מקטע הזיכרון. האורך הכולל של שדה זה הוא 32 סיביות, והוא מפוצל לשני חלקים: סיביות 16-39 וסיביות 56–63 (כאשר סיבית 0 היא הסיבית הראשונה).
- גבול המקטע (Segment Limit) - הכתובת האחרונה הזמינה במקטע. אורך שדה זה הוא 20 סיביות, והוא מפוצל לשני חלקים: 16 הסיביות הראשונות, יחד עם סיביות 48–51 (כאשר סיבית 0 הסיבית הראשונה) מהווים את גבול המקטע. גודל הזיכרון לא מושפע רק מכתובת הבסיס ומגבול המקטע, אלא גם משדה ה-Granuality (ראו בהמשך).
- בית הגישה - סיביות 40–47 מהוות יחד את בית הגישה.
Accessed bit - ביט שהופך ל-1 בכל פעם שניגשים למקטע.
Readable bit/Writable bit: עבור מתאר מקטע שהוא מקטע קוד, זהו ביט קריאה, ואילו עבור מתאר מקטע שהוא מקטע של מידע, זהו ביט כתיבה. בהתאם לסוג הביט, כאשר הוא 1, הקריאה/הכתיבה מותרות (בהתאמה).
Direction/Conforming bit - מטרת הסיבית השלישית בבית הגישה תלויה גם כן בסוג המקטע. עבור מקטע של מידע, הסיבית קובעת אם המקטע "גדל" כלפי מטה או כלפי מעלה. אם המקטע הוא מקטע של קוד: כאשר הביט הוא 0, הקוד יכול להתבצע רק מטבעת ההגנה (אנ') שנקבעה בשדה ה-DPL (שהוא גם חלק מבית הגישה). כאשר הביט הוא 1, הקוד יכול להתבצע בטבעת הגנה נמוכה יותר, כלומר עם הרשאות גבוהות יותר.
ביט הרצה (Executable bit) - קובע האם המקטע הוא מקטע של קוד או מקטע של מידע (כאשר הביט דלוק, זהו מקטע של קוד).
ביט סוג המתאר (Descriptor type bit) - קובע האם מתאר המקטע עוסק במקטע מערכת (כמו TSS או LDT), או האם זהו מקטע של קוד או מידע.
DPL - שתי סיביות שמהוות יחד את מספר הטבעת (ring) הנדרשת עבור המקטע.
Present bit - הערך של סיבית זו אמור להיות 1 עבור כל מקטע תקין. - דגלים - סיביות 52–55. הערך של הסיבית הראשונה בשדה זה הוא תמיד 0. הסיבית השנייה דלוקה רק כאשר מתאר המקטע מתאר מקטע של קוד 64-סיביות. הסיבית השלישית עוסק בגודל המקטע. אם הוא 0, הסגמנט הוא בעל ערך 16 ביט, ואם הוא 1, הסגמנט הוא בעל ערך 32 ביט. הסיבית האחרונה היא שדה ה-Granularity. אם ערך הסיבית הוא 0, אז השדה של גבול המקטע הוא ביחידות של בתים, ואילו אם הוא 1, אז הוא ביחידות של דפים (pages) בגודל 4K.
טבלת מקטעים מקומית[עריכת קוד מקור | עריכה]
טבלת מקטעים מקומית (אנ') דומה לטבלת מקטעים כללית, אולם עוסקת במקטעים של תוכנית ספציפית ולא של מערכת ההפעלה כולה. מספר טבלאות כאלו עשויות להיות מוגדרות על ידי ה-GDT, אם כי רק אחת רלוונטית בכל פעם, לרוב זו שקשורה בתוכנית הנוכחית.
לקריאה נוספת[עריכת קוד מקור | עריכה]
- שרה פולק, מבוא למערכות מחשב ואסמבלי (עמ' 379–383), הוצאת מטח, 2006
- עידן פסט, פיתוח מערכות הפעלה - חלק ב', Digital Whisper 31, 2012, עמ' 12-19
הערות שוליים[עריכת קוד מקור | עריכה]
- ^ עידן פסט, פיתוח מערכות הפעלה - חלק ב', Digital Whisper 31, 2012, עמ' 12
ביאורים[עריכת קוד מקור | עריכה]
- ^ האיור מעט לא מדויק ואם יש ניגוד בינו לבין התוכן בפסקה - הטעות היא בתרשים ולא בתוכן הפסקה