13-01-2009, 21:52
|
|
|
חבר מתאריך: 27.10.05
הודעות: 1,067
|
|
מידע על GDT/IDT/LDT בכתיבת ליבה של מערכת
שלום לכולם.
בתור תחביב התחלטתי לממש מיני מערכת הפעלה משלי. נכון לעכשיו קיים bootloader stage 1 שטוען את bootloader stage 2 והוא אמור להיכנס ל PMODE ולהעביר שליטה לקרנל.
אבל אני נתקלתי במס' בעיות:
בשביל למפה (מהמילה מפה to map) יותר מ 1MB (עד 4GB) של זכרון עלי להגדיר GDT או Global Descriptor Table, אני יודע שהוא מורכב מ selectorים שכל אחד בגודל של 8בית (כלומר כל סלקטור בגודל של 64ביט) והראשון הוא NULL SELECTOR, כמו כן אני יודע שיש צורך להגדיר CODE ו DATA סלקטורים. הבעיה שאני לא יודע מה בדיוק המשמעות של כל ביט בסלקטור ודיי קשה למצוא על זה מידע, אני בספק אם קיים ידע על זה בעיברית אז מידע באנגלית יספיק לי, אם מישהוא מכיר כמובן.
הבעיה אחרת היא ה IDT (Interrupt Descriptor Table) אני יודע שב PMODE קריאה לפסיקה כאשר IDT לא קיים מביא ל triple fault של המעבד ולכן הבנתי שיש צורך להגדיר IDT, אבל שוב לא הצלחתי למצוא עליו מידע.
אותו דבר לגבי LDT שעליו בכלל מידע (האם הוא הכרחי בכלל)?
שאלה נוספת: מה הדרך המקובלת להיכנס ל PMODE, נניח בוט לואדר 1 מעביר שליטה ל 2 עכשיו דרך אחת היא לממש הכל באסמבלי (כולל המבנה של IDT/GDT/LDT) לפתוח את A20 ולשים את הביט של PMODE ב CR0 ואז להבעיר שליטה לקרנל, דרך נוספת היא ישר להעביר שליטה לקרנל והוא יעשה את כל העבודה הזאתי. מה שתי אלה יותר מקובל?
ושאלה אחרונה בשביל להיות בטוח: אחרי ה POST הכתובות 0x00000500 עד 0x00007BFF וכתובות 0x00007E00 עד 0x0009FFFF פנויות וניתן לטעון את הקרנל לשם?
תודה רבה רבה מראש!
|