קורס פיתוח מערכות לינוקס וראסט¶
בקורס הזה אנחנו בונים תוכנות מערכת בראסט וחוקרים את המנגנונים של לינוקס שעליהם הן נשענות. בכל פרק נתחיל מחוזה שאפליקציה צריכה לקיים, נכתוב קוד, נכניס שינוי או כשל ונעקוב אחרי התוצאה עד השפה, ספריית המערכת והקרנל.
הקורס ממשיך את קורס ליבת המחשב. נדרש ידע בשפת C, מצביעים, אסמבלי בסיסי, ELF, תהליכים, זיכרון וירטואלי, תהליכונים ודיבוג. אנחנו לומדים את ראסט מהבסיס המתאים למתכנתי C, וממשיכים עד הפשטות unsafe, ביטול אסינכרוני, reclamation, חקירת קרנל ופריסה של שירות.
הקורס כולל ארבעה־עשר פרקים, ובכל פרק עשר הרצאות עם תרגול ופתרון. כל פרק מסתיים בפרויקט עם פתרון מוסבר. פרויקטי הביניים מחברים בין שכבות, ופרויקט הסיום מחייב לשנות דרישה, להזריק כשל ולהציג ראיות לנכונות ולביצועים.
הכנה לעבודה¶
המעבדות דורשות סביבת לינוקס שאפשר לשחזר, כלי בנייה, debugger ועץ מקור קרנל כאשר מגיעים לפרקים המתאימים. ניסויי קרנל, לחץ משאבים וכשל אחסון מתבצעים ב־VM ייעודית עם נתוני תרגיל. החומר מציין מתי דוגמה דורשת חבילת Cargo, הרשאה, התקן או גרסת ממשק מסוימת.
הבסיס משתמש בראסט יציב. כלים כגון Miri, אפשרויות compiler ניסיוניות ותמיכת ראסט בקרנל נלמדים עם הבחנה מפורשת בין חוזה יציב לבין יכולת שתלויה בגרסה. קריאת קוד הקרנל כוללת שפת C גם כאשר הלקוח ומערכת המשתמש נכתבים בראסט.
תוכן הקורס¶
פרק ראשון: יסודות ראסט¶
נלמד טיפוסים, בעלות, השאלות, זמני חיים, השמדה ושגיאות דרך תוכניות קטנות שניתנות לבדיקה. נבנה כלי עיבוד קלט שהממשק שלו מסביר מי מחזיק כל ערך ומתי מותר להשתמש בו.
פרק שני: ראסט מתקדם¶
נחקור traits, גנריות, dispatch דינמי, GAT, HRTB, שונות, interior mutability ומאקרואים. נבדוק כיצד חתימה ותכנון טיפוסים מצמצמים שימושים שגויים ומשפיעים על הקוד שנוצר.
פרק שלישי: זיכרון וגבולות בינאריים¶
נבנה הפשטות unsafe עם חובות הוכחה, נחקור פריסה ו־provenance ונעטוף ממשקי C. נלמד callbacks, unwind, בנייה ליעד אחר, סביבת no_std ופלט מהדר.
פרק רביעי: תהליכים וממשקי מערכת¶
נעקוב אחרי ELF, טעינה, syscalls, מתארים, ירושה, exec, אותות ומסופים. נבנה מפקח PTY עם זמן מוגבל, העברה חלקית וניקוי משאבים.
פרק חמישי: זיכרון וירטואלי¶
נחבר מיפויים לחיי הפניות, נמדוד faults, page cache, NUMA ו־false sharing ונבחן פריסת נתונים ו־SIMD. נבנה מנוע סריקה עם תקציב והבחנה בין מקור משתנה לעותק יציב.
פרק שישי: קבצים ואחסון¶
נחקור פתרון נתיב, VFS, metadata, נעילות, sparse files ומסלול בקשה להתקן. נבנה יומן רשומות עם סנכרון והתאוששות ונפריד נראות, atomicity ו־durability.
פרק שביעי: מקביליות וסנכרון¶
נלמד תהליכונים, Send ו־Sync, נעילות, תנאי המתנה, atomics, סדרי זיכרון והשבת זיכרון. נבנה תור SPSC ותור עבודה שניתן לסגור ולבטל, ונחקור סדרי ביצוע באמצעות מודל ובדיקות.
פרק שמיני: תכנות אסינכרוני¶
נפרק Future, Pin, executors, יקיצות וביטול. נבנה לולאת אירועים ונחבר epoll ו־io_uring לחוזי חיים שאינם מאפשרים לשחרר באפר בזמן שהמערכת עדיין משתמשת בו.
פרק תשיעי: רשתות ותקשורת¶
נבנה פרוטוקולים מעל זרמים ו־datagrams, ננהל חיבורים ולקוחות איטיים ונעביר מתארים בממשק מקומי. נחקור את המסלול דרך מחסנית הרשת ואת גבולות האישור והביטול.
פרק עשירי: בידוד ושירותים¶
נחבר הרשאות, capabilities, namespaces, cgroups, seccomp ומדיניות שירות. נריץ מערכת עם מוכנות, כיבוי מסודר, תצפית ומגבלות משאבים שניתנות לבדיקה.
פרק אחד־עשר: דיבוג וביצועים¶
נחקור תקלות עם GDB, strace, perf, tracing ו־eBPF. נבנה טיעון מתוך ראיות, נפריד זמן ריצה מזמן המתנה ונבדוק תיקון מול דוגמת נגד.
פרק שנים־עשר: הקרנל של לינוקס¶
נבנה ונאתחל קרנל מעבדה, נקרא מקור ונחקור contexts, נעילות, RCU, הקצאה ומנהלי התקנים. רכיב לימודי ולקוח משתמש יחייבו חוזה ABI ופירוק בטוח תחת פעילות.
פרק שלושה־עשר: תתי־מערכות¶
נעקוב אחרי פעולות דרך אחסון, התקנים, DMA, גרפיקה, אודיו, רשת ווירטואליזציה. נבחר התמחות מעשית אחת לעבודה עמוקה, בלי לוותר על הבנת הגבולות המשותפים בין התתי־מערכות.
פרק ארבעה־עשר: הנדסת מערכת¶
נשלב בנייה משוחזרת, אריזה, עדכון, אבטחה, ניידות ובדיקות כשל. פרויקט הסיום יחבר את כל השכבות למערכת שניתן להפעיל, לחקור ולשנות עם ראיות ברורות לכל החלטה.
דרך הלימוד¶
קראו את ההרצאה, הריצו את הדוגמה בסביבת המעבדה ובצעו את התרגול לפני פתיחת הפתרון. שמרו קוד, פקודות, גרסאות ותוצאות כדי שאפשר יהיה לשחזר כל טענה. כאשר דוגמה מיועדת להיכשל, בדקו שהכשל נובע מהחוזה שנלמד ולא מבעיה אחרת בסביבה.
השלמת פרק נמדדת ביכולת להסביר ולשנות את המימוש. נרצה לדעת מה נשבר אם סדר האירועים משתנה, מי אחראי למשאב בכל שלב ומה הוכח בבדיקה לעומת מה שעדיין דורש טיעון או ניסוי נוסף.
פרויקטי ביניים והגמר¶
הפרויקטים הנוספים בודקים חיבור עצמאי בין שכבות, מעבר למעבדת הפרק. מתחילים כל אחד אחרי הפרקים שמצוינים במפרט שלו.
- הפרויקטים מפרטים ופתרונות של פרויקטי הביניים.
- הפרויקט המסכם מפרט פרויקט הגמר.