לדלג לתוכן

קורס פיתוח מערכות ווינדוס וסי פלוס פלוס

בקורס הזה נבנה תוכנות לווינדוס ונעקוב אחרי מה שמערכת ההפעלה עושה בשבילן. נתחיל מהחיים של אובייקט 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, העתקה והעברה. נבנה קוד שמסביר את הבעלות שלו דרך הטיפוסים והמבנה.

פרק 2: ספריות C++ מתקדמות

נעמיק בגנריות, ספריות, containers, exceptions ותכנון ממשק. נבדוק איך הפשטה משפיעה על שגיאות ועל הקוד שנוצר.

פרק 3: בנייה וטעינת תוכניות

נחבר compilation, linking, PE, DLL וABI למסלול הטעינה. נבדוק symbols, exports ותאימות בין רכיבים.

פרק 4: ארכיטקטורת NT ותהליכים

נכיר את NT דרך handles, objects, תהליכים וthreads. נבנה supervisor שמחזיק את הילדים שלו ומסיים אותם לפי חוזה.

פרק 5: ניהול זיכרון

נחקור כתובות וירטואליות, הקצאה, הגנות, faults וshared memory. נחבר תצפית על דפים לחיי אובייקטים של השפה.

פרק 6: מקביליות וביצוע אסינכרוני

נבנה סנכרון, atomics, תורים וI/O אסינכרוני. נבדוק cancellation, IOCP וקורוטינות בלי לשחרר context מוקדם מדי.

פרק 7: קבצים ותקשורת בין תהליכים

נעמיק בקבצים, נתיבים, persistence ותקשורת מקומית. נבדיל בין כתיבה שנראית לעין לבין מידע שאושר כעמיד.

פרק 8: אבטחה ושירותים

נחבר tokens, access checks, זהות ושירותי מערכת. נבנה ממשק ששומר על הרשאות גם תחת כשל וביטול.

פרק 9: רשתות ורכיבי COM

נבנה פרוטוקולים ורכיבי COM ונחקור apartments, marshaling וreentrancy. נעקוב אחרי הבעלות גם כשהקריאה חוצה גבול.

פרק 10: שולחן עבודה ואבחון

נבנה ממשק native ונחקור crashes, hangs וביצועים. נחבר trace, symbols, בדיקות וחבילה שניתנת להתקנה במחשב אחר.

פרק 11: שפת C# ומנוע הריצה

נלמד C# דרך טיפוסים, IL, JIT, טעינה וGC. נחקור מה מחזיק אובייקט חי ומה גורם להקצאה ולpause.

פרק 12: שילוב קוד מנוהל וטבעי

נחבר async, UI וC ABI. ננהל callbacks, SafeHandle וbuffers שחוצים בין managed לnative, ונבדוק סגירה תחת פעילות.

פרק 13: הקרנל ופיתוח דרייברים

נבנה מעבדת WDK ונחקור IRQL, זיכרון, requests, cancellation וdevice lifecycle. נפתח driver עם גבולות שאפשר לבדוק.

פרק 14: מערכת מלאה ופרויקט גמר

נרחיב לחומרה, מסננים ויצירת קוד, ונחבר את המערכת לrecovery, מדידה ומסירה. פרויקט הגמר בוחן הבנה באמצעות שינוי וחקירה.

פרויקטי ביניים והגמר

הפרויקטים הנוספים בודקים חיבור עצמאי בין שכבות, מעבר למעבדת הפרק. מתחילים כל אחד אחרי הפרקים שמצוינים במפרט שלו.