לדלג לתוכן

2.1 הקדמה הרצאה

מערכת ההפעלה MS-DOS

מערכת ההפעלה DOS של מיקרוסופט שינתה את העולם.
תוכנה אחת, שכל אחד יכול להריץ על המחשב שלו שמעניקה לו:
- מערכת קבצים, לשמירת מידע בקבצים ותיקיות על הhard disk (האחסון)
- פורמט קבצי הרצה אחיד (הMZ) שמאפשר לכל אחד לכתוב תוכנה לDOS ולהריץ אותה בכל מחשב DOS
- רשימה של פסיקות מוכנות מראש שמאפשרות לכל אחד לכתוב תוכנה שמשתמשת בקבצים ובכל הפיצ'רים של מערכת ההפעלה בקלות.
- טרמינל עם המון פקודות שמאפשר לנהל את כל המערכת ולהריץ קבצי הרצה שלכם ממש כפקודות.
- רץ על בסיס הארכטיקטורת מעבדים הנפוצה בעולם באותה תקופה, ה8086 של אינטל.

הבעיות

עדיין ישנם כמה בעיות בMS-DOS ובארכיטקטורת ה8086.
- גודל האוגרים הכללים: מכיוון שגודל האוגרים הוא 16 ביט ב8086, ביצוע פעולות חישוב מתמטיות למספרים שגדולים מ 2^16 (65536) הופך להיות קשה מאוד.
- גדול הRAM, עד כו 8086 תמך בכתובות עד 2^20, (מיליון בתים)- ועוד בקושי, נאלצנו לעשות טריקים עם אוגרי סגמנט בגודל של 16 בתים, עם offset בגודל של 16 בתים- ועדיין קיבלנו גודל לא מספק של כתובות זכרון- מיליון בתים זה לא הרבה.
- הרצת תוכנות בו זמנית: עם המערכות הקיימות, איי אפשר ליצור הרצה מקבילה של שני תוכנות במקביל- מה אם נרצה לפתוח שני תוכנות במקביל? אין דרך הרמטית לגרום לזה לעבוד.
- הגנת המערכת: כרגע, כל תוכנה בMS-DOS שאנחנו מריצים- יש לה את כל הגישות להרוס את כל המערכת! כל תוכנה יכולה לממש פסיקות מחדש, להשתמש בIN ו-OUT כדי לתקשר עם הדיסק ולמחוק אותו לגמרי, גישה מלאה לכל הזכרון הפיזי של המעבד ולערוך אותו לגמרי איך שנרצה. כלומר, כל תוכנה שתריצו- יכולה לשבור לכם את כל המחשב.

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

הפתרון

1. המעבד 80386 והמעבר ל־Protected Mode

למה צריך בכלל מעבד חדש?

אז הבנו ש־8086 מוגבל:

  • אוגרים של 16 ביט – לא מספיקים למספרים גדולים.
  • תמיכה בזיכרון של עד 1MB (כתובת של 2^20) – בקושי.
  • אין אפשרות להגן על הקוד – כל תוכנה יכולה לשבור את המחשב.
  • אין תמיכה אמיתית בהרצת תוכנות במקביל.

אם רוצים מחשב יציב, חזק, ורב־משימתי – צריך לשנות את הארכיטקטורה.

בשנות ה־80 אינטל מציגה את סדרת המעבדים החדשה שלה ובין היתר את מעבד ה80386 – שהוא Game Changer.

מה זה Protected Mode?

למעבד ה80386 יש 2 מצבים אפשריים שהוא יכול להיות בהם, מצב הReal Mode ומצב הProtected Mode.
הProtected Mode הוא מצב שהמעבד נכנס אליו – שבו הוא עובד אחרת לגמרי מאשר במצב הרגיל (Real Mode של 8086).

  • במצב רגיל (Real Mode) – כל התוכנות שוות, אין הבדל בין מערכת ההפעלה לתוכנה. (בדיוק כמו ב8086 ובכל התוכנות שכתבנו עד כו)

  • במצב מוגן (Protected Mode) – המעבד יודע להבחין בין קוד רגיל לקוד מערכת, ולכפות חוקים.

למשל:

פעולה Real Mode Protected Mode
גישה ל־IN/OUT מותר בלתי אפשרי
החלפת פסיקות (שינוי טבלת הivt) מותר בלתי אפשרי
גישה לאיזה זכרון שנרצה מותר בלתי אפשרי

חידושים במעבד 80386

1. אוגרים של 32 ביט
במקום אוגרי ה16 ביט שאנחנו מכירים AX, BX, CX – נוספו אוגרים EAX, EBX, ECX... – כל אחד בגודל של 32 ביט.
למשל, הEAX היא הגרסה המוגדלת של אוגר הAX, (הextended ax register)
באמצעות הEAX ניתן לגשת לאוגר בגודל של 32 ביט, באמצעות AX ניתן לגשת ל16 ביטים הראשונים של אוגר הEAX, באמצעות AL ניתו לגשת ל8 ביטים הראשונים של אוגר הEAX, ובאמצעות הAH ניתן לגשת ל8 ביטים הנוספים בדיוק לאחר AL.

למשל:

mov eax, 12345678h  ; אפשר לטעון מספרים הרבה יותר גדולים

2. מרחב זיכרון של 4 גיגה
זוכרים שהיינו תקועים על מגה אחד בלבד?
עכשיו – בזכות אוגרים של 32 ביט – אפשר לכתוב לכתובות כמו 0xC0000000, שזה יותר מ־3 גיגה! (2^32=4294967296 בתים!)

3. שליטת מערכת על ההרשאות
יש מצב שבו המעבד מריץ קטע קוד מסוים בReal Mode כדי לתת לו גישות (כמו לקטע קוד שמגדיר פסיקות במערכת ההפעלה), ומצב שבו המעבד מריץ קטע קוד אחר עם Protected Mode כדי לוודא שלא ישבור את המערכת (כמו תוכנה שהורדתם מהאינטרנט שאתם מריצים במערכת ההפעלה).
כך מערכת ההפעלה שולטת – והתוכנה שרצה לא יכולה "לשבור" את המחשב יותר.

4. תמיכה ב־Paging
זו שיטה חדשה למפות כתובות (חידוש לסגמנטציה) – נרחיב עליה בהמשך – המאפשרת:
- לכל תוכנה שרצה במערכת ההפעלה לחיות במרחב זכרון משלה, כך ששום תוכנה שרצה במקביל אליה לא תוכל לגשת לזכרון שלה.
- השיטה מאפשרת דואגת ששום תוכנה לא תוכל לגשת לזכרון של מערכת ההפעלה, וכל תוכנה שרצה יכולה לגשת רק לזכרון שלה.
- השיטה גורמת לתוכנות "לחשוב" כיאלו שרק הם נמצאים בזכרון הענק של ה4GB RAM. כאשר כל כתובת בRAM פנויה להם ורק להם.


איך נכנסים ל־Protected Mode?

פשוט לא.
סתם 😄 האמת שזה לא כזה פשוט, אבל נבין את זה:

  1. קודם כל – כל מחשב מתחיל ב־Real Mode כשהוא נדלק.

  2. אחרכך, הBIOS רץ (כמובן עדיין בReal Mode) ומגדיר את הivt הדיפולטי שאנחנו מכירים, ומשם מריץ את מערכת ההפעלה שמותקנת לנו על הדיסק.

  3. מערכת ההפעלה מגדירה פסיקות שונות, ומתאחלת את כל החלקים שלה הכל בReal Mode

  4. כאשר מערכת ההפעלה סיימה לאתחל את עצמה, היא מתחילה לאתחל את ה"יוזר מוד", התוכנות שרצות בהרשאות נמוכות (בProtected Mode).

  5. לכל מערכת הפעלה יש את התוכנה הראשונה זו, שרצה בהרשאות נמוכות. והיא אחראית להריץ את כל התוכנות שרצות בהרשאות נמוכות. כדי להריץ את התוכנה הזו ולהפעיל את ה"Protected Mode" צריכים לקרות כמה דברים נוספים.

  6. קודם צריך להכין את טבלת הGDT (Global Descriptor Table), טבלה שמסבירה למעבד איזה סגמנטים יכולים לרוץ בהרשאות גבוהות, ואילו סגמנטים רצים בהרשאות נמוכות.

  7. אחרכך אנחנו צריכים להפעיל ביט מיוחד באוגר מיוחד בשם CR0 – שמכניס את המעבד למצב Protected.

  8. ולבסוף, אנחנו קופצים לסגמנט המיוחד שהגדרנו שמריץ קוד בהרשאות נמוכות, וזהו!

בהמשך נדבר יותר מעבר על מה היא טבלת הGDT וכיצד היא מאפשרת לנו להגדיר למעבד איזה קוד רץ באיזה הרשאות, וכיצד אפשר לקפוץ לProtected Mode, וכמובן נדבר על מה הוא Paging בכלל.

מה קיבלנו מהמעבר הזה?

  • מהירות וחוזק – בזכות 32 ביט וזיכרון ענק.

  • בטיחות – אין יותר קריסה מכל תוכנה טיפשית.

  • אפשרות לתכנן מערכת אמיתית – עם תוכנות רבות, משתמשים, ניהול קבצים, והרשאות.

  • אפשרות לעבוד עם רגיסטרים מוגדלים.

  • רגיסטר הFLAG גדל לEFLAG (מ16 ביט ל32)
  • רגיסטרי הIP גדל להיות EIP כדי לתמוך בכתובות בגודל 32 ביט
  • רגיסטר הסגמנטים נשארו באותו הגודל, (16 ביט)- בהרצאה הבאה נסביר מדוע
  • רגיסטר הSP גדל לESP כדי לתמוך בכתובת 32 ביט.

שאלות למחשבה

  • אם כל תוכנה מוגבלת – איך היא מדברת עם הדיסק? עם המסך?

  • איך אפשר להריץ שתי תוכנות באותו זמן?

  • מה אם נגמר לנו הזיכרון?