קורס פיתוח מערכות ווינדוס וסי פלוס פלוס¶
בקורס הזה נבנה תוכנות לווינדוס ונעקוב אחרי מה שמערכת ההפעלה עושה בשבילן. נתחיל מהחיים של אובייקט C++, נגיע לתהליכים, זיכרון וI/O, ונמשיך לשירותים, רכיבים, קוד מנוהל ודרייברים. בכל פעם נרצה להבין מי מחזיק את המשאב, מה קורה כשהפעולה נכשלת ואיזו ראיה מאפשרת לנו להסביר את התוצאה.
הקורס ממשיך את קורס ליבת המחשב. נדרש בסיס בשפת C, מצביעים, אסמבלי, מחסנית, תהליכים וזיכרון וירטואלי. את C++ לומדים כאן מהיסודות שמתאימים למתכנתי C, ואת C# ואת .NET לומדים בהמשך דרך הקשר למנגנונים שכבר חקרנו.
הקורס כולל ארבעה־עשר פרקים, ובכל פרק עשר הרצאות. לכל הרצאה יש תרגול ופתרון מוסבר, ובסוף כל פרק יש פרויקט. הפרויקטים מצטברים למערכת שאפשר לבנות, להפעיל, לחקור ולשנות גם כשלא הכול קורה בסדר שקיווינו לו.
סביבת העבודה¶
המעבדות הטבעיות משתמשות בVisual Studio ובWindows SDK, עם יעד x64 ובחירת תקן C++ כפי שמצוינת בשיעור. החלק המנוהל משתמש ב.NET 10. ניסויי הקרנל דורשים WDK, סמלים וVM ייעודית לפי פרק 13. את גרסת הכלים ותצורת מערכת ההפעלה שומרים יחד עם כל ניסוי שתלוי בפרטי מימוש.
הדוגמאות מסמנות מתי הן תוכניות שלמות, קבצים שמתחברים זה לזה או קטע שמחליף חלק מדוגמה קודמת. גם כשל מכוון הוא ניסוי: בודקים למה נכשל ומה הוכח, ולא מעתיקים את הקוד הבעייתי למוצר. פעולות התקנה, crash וניסוי driver מתבצעות בסביבת המעבדה שהוגדרה עבורן.
איך עובדים עם החומר¶
קראו את הבעיה לפני הקוד ונסו לנחש מה יקרה. אחר כך הריצו, שנו דבר אחד והשוו את התוצאה. כאשר ההסבר והפלט אינם מתאימים, חפשו מה חסר במודל שלכם לפני שמוסיפים עוד flag או Sleep.
התרגול מגיע לפני הפתרון. הפתרון מסביר גם את גבולות הבדיקה ואת ההנחות שנדרשות כדי שהמימוש יהיה נכון. שומרים קוד, פקודות, גרסאות ותוצאות, כך שאפשר לחזור לחקירה אחרי שהפרויקט כבר התקדם.
אבני הדרך¶
בסוף פרק 3 תוכלו להסביר איך קוד הופך לקובץ שנטען לזיכרון. בסוף פרק 7 תוכלו לבנות כלי מערכת עם תהליכים, זיכרון, I/O וסיום מתואם. בסוף פרק 10 תוכלו לאבחן ולהפיץ תוכנה טבעית. הפרקים 11 ו12 מוסיפים runtime מנוהל וחוזי interop, ופרק 13 מעביר את אותה חשיבה אל הקרנל.
פרויקט הסיום מחייב גם recovery, תקציבים, חקירה עיוורת ושינוי דרישה. ההתקדמות נמדדת ביכולת להסביר ולשנות את הקוד, ולא במספר שמות הAPI שמכירים.
תוכן הקורס¶
פרק 1: שפת C++ וזיכרון¶
נלמד ערכים, references, חיי אובייקטים, RAII, העתקה והעברה. נבנה קוד שמסביר את הבעלות שלו דרך הטיפוסים והמבנה.
- ההרצאה 1.1 - סביבת עבודה ומודל ביצוע
- ההרצאה 1.2 - אתחול והסקת טיפוסים
- ההרצאה 1.3 - ערכים זמניים וחיי אובייקטים
- ההרצאה 1.4 - ייצוג אובייקט ואחסון
- ההרצאה 1.5 - בעלות וניקוי באמצעות RAII
- ההרצאה 1.6 - העתקה והעברת בעלות
- ההרצאה 1.7 - בעלות יחידה ותצוגות
- ההרצאה 1.8 - בעלות משותפת וחיים תלויים
- ההרצאה 1.9 - מודל מחלקות ופולימורפיזם
- ההרצאה 1.10 - תקינות והתנהגות לא מוגדרת
- הפרויקט פרויקט - ספריית בעלות
פרק 2: ספריות C++ מתקדמות¶
נעמיק בגנריות, ספריות, containers, exceptions ותכנון ממשק. נבדוק איך הפשטה משפיעה על שגיאות ועל הקוד שנוצר.
- ההרצאה 2.1 - תבניות והפקת קוד
- ההרצאה 2.2 - אילוצים וממשקים גנריים
- ההרצאה 2.3 - חישוב בזמן בנייה ומודולריות
- ההרצאה 2.4 - מכולות כבחירה הנדסית
- ההרצאה 2.5 - אלגוריתמים טווחים ותצוגות
- ההרצאה 2.6 - ייצוג מצב ופעולות בספרייה
- ההרצאה 2.7 - חריגות וערבויות פעולה
- ההרצאה 2.8 - מקצים ומשאבי זיכרון
- ההרצאה 2.9 - גבולות ספרייה ותאימות
- ההרצאה 2.10 - הוכחת איכות ספרייה
- הפרויקט פרויקט - ספריית רשומות
פרק 3: בנייה וטעינת תוכניות¶
נחבר compilation, linking, PE, DLL וABI למסלול הטעינה. נבדוק symbols, exports ותאימות בין רכיבים.
- ההרצאה 3.1 - מהמקור לקובץ אובייקט
- ההרצאה 3.2 - מוסכמת הקריאה של Windows
- ההרצאה 3.3 - פירוק מחסנית וספריות ריצה
- ההרצאה 3.4 - מבנה PE וטעינה לזיכרון
- ההרצאה 3.5 - קישור דינמי וזהות סימבולית
- ההרצאה 3.6 - תחילת תוכנית והטוען
- ההרצאה 3.7 - טעינה מאובטחת ותאימות
- ההרצאה 3.8 - סמלים ואופטימיזציה
- ההרצאה 3.9 - ארכיטקטורות וחוזי WinAPI
- ההרצאה 3.10 - בנייה והפצה ניתנות לשחזור
- הפרויקט פרויקט - מנתח PE וספרייה יציבה
פרק 4: ארכיטקטורת NT ותהליכים¶
נכיר את NT דרך handles, objects, תהליכים וthreads. נבנה supervisor שמחזיק את הילדים שלו ומסיים אותם לפי חוזה.
- ההרצאה 4.1 - מפת NT ומעבר לקרנל
- ההרצאה 4.2 - אתחול והקמת סביבת משתמש
- ההרצאה 4.3 - מנהל האובייקטים ומרחב השמות
- ההרצאה 4.4 - יצירת תהליך וזהותו
- ההרצאה 4.5 - מחזור חיי תהליך ובידוד משאבים
- ההרצאה 4.6 - תהליכונים והקשר ביצוע
- ההרצאה 4.7 - תזמון וטופולוגיית מעבדים
- ההרצאה 4.8 - המתנה וקריאות APC
- ההרצאה 4.9 - מאגרי תהליכונים וסביבות משתמש
- ההרצאה 4.10 - חקירת חיים מקצה לקצה
- הפרויקט פרויקט - מנהל תהליכי עבודה
פרק 5: ניהול זיכרון¶
נחקור כתובות וירטואליות, הקצאה, הגנות, faults וshared memory. נחבר תצפית על דפים לחיי אובייקטים של השפה.
- ההרצאה 5.1 - מרחב כתובות והתחייבות לזיכרון
- ההרצאה 5.2 - תרגום כתובות ותקלות דף
- ההרצאה 5.3 - הגנות וחיי מיפוי
- ההרצאה 5.4 - מנהל הזיכרון מבפנים
- ההרצאה 5.5 - קבוצת עבודה ולחץ זיכרון
- ההרצאה 5.6 - מיפוי קבצים ושיתוף דפים
- ההרצאה 5.7 - מקצים וערמות משתמש
- ההרצאה 5.8 - מחסניות ומקומיות זיכרון
- ההרצאה 5.9 - חקירת השחתה ודליפות
- ההרצאה 5.10 - תכנון תחת מגבלת זיכרון
- הפרויקט פרויקט - סורק קבצים מוגבל זיכרון
פרק 6: מקביליות וביצוע אסינכרוני¶
נבנה סנכרון, atomics, תורים וI/O אסינכרוני. נבדוק cancellation, IOCP וקורוטינות בלי לשחרר context מוקדם מדי.
- ההרצאה 6.1 - בעלות ותיאום בין תהליכונים
- ההרצאה 6.2 - מבנה עבודה וסיום שיתופי
- ההרצאה 6.3 - מודל הזיכרון של השפה
- ההרצאה 6.4 - סדרים אטומיים וגבולותיהם
- ההרצאה 6.5 - מבנים ללא נעילה וחיי צמתים
- ההרצאה 6.6 - חוזה פעולה חופפת
- ההרצאה 6.7 - מנוע השלמות עם IOCP
- ההרצאה 6.8 - קורוטינות מעל מערכת ההפעלה
- ההרצאה 6.9 - עומס חסימות ושרידות
- ההרצאה 6.10 - אימות מערכת מקבילית
- הפרויקט פרויקט - מנוע קריאה אסינכרוני
פרק 7: קבצים ותקשורת בין תהליכים¶
נעמיק בקבצים, נתיבים, persistence ותקשורת מקומית. נבדיל בין כתיבה שנראית לעין לבין מידע שאושר כעמיד.
- ההרצאה 7.1 - שמות פתיחה וזהות קובץ
- ההרצאה 7.2 - מסלול בקשת קלט ופלט
- ההרצאה 7.3 - מטמון וגישה ללא אגירה
- ההרצאה 7.4 - עמידות ופורמט נתונים
- ההרצאה 7.5 - מערכות קבצים ושינוי מבנה
- ההרצאה 7.6 - מעקב שינויים ונעילה
- ההרצאה 7.7 - נפחים וטיפול בכשל
- ההרצאה 7.8 - צינורות ופרוטוקול מקומי
- ההרצאה 7.9 - זיכרון משותף והתאוששות עמית
- ההרצאה 7.10 - אמינות בין תהליכים
- הפרויקט פרויקט - מאגר מקומי עמיד
פרק 8: אבטחה ושירותים¶
נחבר tokens, access checks, זהות ושירותי מערכת. נבנה ממשק ששומר על הרשאות גם תחת כשל וביטול.
- ההרצאה 8.1 - זהות והרשאות על אובייקטים
- ההרצאה 8.2 - הקשר אבטחה והגבהה
- ההרצאה 8.3 - בידוד וגבולות אמון
- ההרצאה 8.4 - שמירת סודות
- ההרצאה 8.5 - שירות ומנהל השירותים
- ההרצאה 8.6 - עצירה והתאוששות של שירות
- ההרצאה 8.7 - שירות מול משתמש
- ההרצאה 8.8 - תצורה ומדיניות
- ההרצאה 8.9 - אבחון וניהול
- ההרצאה 8.10 - בדיקת שירות שלם
- הפרויקט פרויקט - שירות עבודות
פרק 9: רשתות ורכיבי COM¶
נבנה פרוטוקולים ורכיבי COM ונחקור apartments, marshaling וreentrancy. נעקוב אחרי הבעלות גם כשהקריאה חוצה גבול.
- ההרצאה 9.1 - חיבור וזרם של מידע
- ההרצאה 9.2 - רשת אסינכרונית ועומס
- ההרצאה 9.3 - הודעות ונתיבי רשת
- ההרצאה 9.4 - זהות והצפנת תעבורה
- ההרצאה 9.5 - קריאות מרוחקות וחוזי בקשה
- ההרצאה 9.6 - זהות ובעלות ברכיב
- ההרצאה 9.7 - דירות תהליכונים וכניסה חוזרת
- ההרצאה 9.8 - העברת ממשקים בין גבולות
- ההרצאה 9.9 - אוטומציה וממשקי זמן ריצה
- ההרצאה 9.10 - רכיב מתקשר תחת כשל
- הפרויקט פרויקט - רכיב עבודות מתקשר
פרק 10: שולחן עבודה ואבחון¶
נבנה ממשק native ונחקור crashes, hangs וביצועים. נחבר trace, symbols, בדיקות וחבילה שניתנת להתקנה במחשב אחר.
- ההרצאה 10.1 - חלון תור ולולאת הודעות
- ההרצאה 10.2 - עבודה ברקע ציור ותצוגה
- ההרצאה 10.3 - המעטפת וחיי המחשב
- ההרצאה 10.4 - חקירת קריסה וסמלים
- ההרצאה 10.5 - השחתת זיכרון וחקירת תקיעות
- ההרצאה 10.6 - עקיבה שמסבירה התנהגות
- ההרצאה 10.7 - מדידה ושיפור ביצועים
- ההרצאה 10.8 - בדיקות מוצר וחבילות אבחון
- ההרצאה 10.9 - התקנה עדכון וחזרה לאחור
- ההרצאה 10.10 - מוסרים גרסה שאפשר לחקור
- הפרויקט פרויקט - ממשק למנהל התהליכים
פרק 11: שפת C# ומנוע הריצה¶
נלמד C# דרך טיפוסים, IL, JIT, טעינה וGC. נחקור מה מחזיק אובייקט חי ומה גורם להקצאה ולpause.
- ההרצאה 11.1 - מפת .NET ומערכת הטיפוסים
- ההרצאה 11.2 - מצב אובייקט והעברת נתונים
- ההרצאה 11.3 - גנריקה וייצוג נתונים
- ההרצאה 11.4 - פונקציות סדרות וחיים תלויים
- ההרצאה 11.5 - משאבים ושגיאות בעולם מנוהל
- ההרצאה 11.6 - מ־IL לקוד רץ
- ההרצאה 11.7 - טעינה פריקה וזהות טיפוס
- ההרצאה 11.8 - איסוף זיכרון והישארות בחיים
- ההרצאה 11.9 - תכנון זיכרון מנוהל
- ההרצאה 11.10 - קוד unsafe וחקירת CLR
- הפרויקט פרויקט מסכם
פרק 12: שילוב קוד מנוהל וטבעי¶
נחבר async, UI וC ABI. ננהל callbacks, SafeHandle וbuffers שחוצים בין managed לnative, ונבדוק סגירה תחת פעילות.
- ההרצאה 12.1 - מודל עבודה מנוהל
- ההרצאה 12.2 - מכונת המצבים של async
- ההרצאה 12.3 - ביטול ויסות וסיום
- ההרצאה 12.4 - מה־runtime אל מערכת ההפעלה
- ההרצאה 12.5 - חוזה בינארי וקריאות PInvoke
- ההרצאה 12.6 - ייצוג והמרת נתונים
- ההרצאה 12.7 - בעלות בין מנועי ריצה
- ההרצאה 12.8 - Callbacks והשלמות חוזרות
- ההרצאה 12.9 - ממשק משתמש ורכיבים מעורבים
- ההרצאה 12.10 - אבחון והפצת מוצר מעורב
- הפרויקט פרויקט מסכם
פרק 13: הקרנל ופיתוח דרייברים¶
נבנה מעבדת WDK ונחקור IRQL, זיכרון, requests, cancellation וdevice lifecycle. נפתח driver עם גבולות שאפשר לבדוק.
- ההרצאה 13.1 - סביבת קרנל וחוזה ביצוע
- ההרצאה 13.2 - הקשר זיכרון ורמות פסיקה
- ההרצאה 13.3 - באפרים של משתמש ודפים נעולים
- ההרצאה 13.4 - סנכרון ועבודה נדחית
- ההרצאה 13.5 - התקן ובקשת קלט ופלט
- ההרצאה 13.6 - ביטול וסיום בקשות
- ההרצאה 13.7 - מימוש באמצעות KMDF
- ההרצאה 13.8 - חיי התקן וניהול כוח
- ההרצאה 13.9 - גישה לחומרה ובחירת מודל
- ההרצאה 13.10 - אימות אבטחה ופריסה
- הפרויקט פרויקט - התקן תוכנה עם בקשות מושהות
פרק 14: מערכת מלאה ופרויקט גמר¶
נרחיב לחומרה, מסננים ויצירת קוד, ונחבר את המערכת לrecovery, מדידה ומסירה. פרויקט הגמר בוחן הבנה באמצעות שינוי וחקירה.
- ההרצאה 14.1 - אמון אתחול ובידוד חומרה
- ההרצאה 14.2 - תורים שעונים ובעלות בחומרה
- ההרצאה 14.3 - מסננים וחיי קריאות חוזרות
- ההרצאה 14.4 - יצירת קוד וחוזה המכונה
- ההרצאה 14.5 - איך חוקרים מנגנון חדש
- ההרצאה 14.6 - ארכיטקטורה עם גבולות ברורים
- ההרצאה 14.7 - התאוששות בלי לנחש מה קרה
- ההרצאה 14.8 - תקציבים והוכחת ביצועים
- ההרצאה 14.9 - חקירה והגנת תכנון
- ההרצאה 14.10 - מסירה והרחבה עצמאית
- הפרויקט פרויקט - חקירת שני סוגי דליפה
פרויקטי ביניים והגמר¶
הפרויקטים הנוספים בודקים חיבור עצמאי בין שכבות, מעבר למעבדת הפרק. מתחילים כל אחד אחרי הפרקים שמצוינים במפרט שלו.
- הפרויקטים מפרטים ופתרונות של פרויקטי הביניים.
- הפרויקט המסכם מפרט פרויקט הגמר.
- ההתמחויות שישה מסלולים לבחירת שתי מעבדות.