Windows Virtualization Internals (חלק 1) — איפה Windows שלכם באמת רץ: hypervisor ו-partitions

· עודכן בתאריך: · · Windows, virtualization, Hyper-V, hypervisor, SLAT, VMBus

היסטוריית עדכונים (גרסה ראשונה, פורסמה בתאריך 22 Aug 2026)
פרסום ראשון
לצטט את המאמר הזה(DOI (ארכיון רשום): 10.5281/zenodo.22176839)

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

Go Komura (2026). Windows Virtualization Internals (חלק 1) — איפה Windows שלכם באמת רץ: hypervisor ו-partitions. KomuraSoft LLC. https://comcomponent.com/he/blog/windows-virtualization-internals-hypervisor/

DOI (ארכיון רשום)
10.5281/zenodo.22176839
DOI (הגרסה האחרונה שנרשמה)
10.5281/zenodo.22176840

מעולם לא יצרתם VM אחד, ובכל זאת System Information (msinfo32) ב-Windows 11 מציג Running בשדה Virtualization-based security. מה המשמעות של התצוגה הזו?

במחשב הזה, Windows המארח עצמו כבר רץ מעל hypervisor. ב-Windows 11, VBS מופעל כברירת מחדל בתצורות שעומדות בתנאים, למשל התקנה נקייה על חומרה תואמת, והיסוד הזה בשימוש גם אם מעולם לא יוצרים VM.1 גם WSL2 וגם Windows Sandbox משתמשים באותו Windows hypervisor.

חלק 1 מסביר איפה Windows המארח מסיים לרוץ כשמפעילים Hyper-V, דרך חלוקת התפקידים בין CPU, זיכרון ו-I/O של devices. זה הפרק שקודם מיישר את המבט של “תוכנת VM שיושבת מעל Windows”.

“Windows Virtualization Internals” — כל 3 החלקים

מסתכלים על אותו Windows hypervisor בסדר יסוד → בידוד אבטחה → יישום ל-VMs קלות.

חלק השאלה המרכזית
חלק 1: ה-hypervisor ו-partitions (המאמר הזה) איפה Windows המארח רץ?
חלק 2: VBS, HVCI ו-Credential Guard איפה שמים סוד שאפילו ה-kernel לא יכול לקרוא?
חלק 3: WSL2, Windows Sandbox ו-containers למה אפשר להקל בלי לוותר על בידוד?

הנחות המאמר הזה

פריט פירוט
קהל יעד מפתחים ומפעילים שרוצים להבין את המנגנונים מתחת ל-Hyper-V, WSL2 ו-Windows Sandbox
סביבה Windows 10/11 x64 או Windows Server עדכני. דיון ה-rings, VT-x/AMD-V ו-EPT/RVI מניח x64; Arm64 משתמש במנגנונים אחרים כמו exception levels
ידע רקע ההבחנה בין kernel mode ל-user mode. אין צורך בניסיון תפעול VM או בידע בפיתוח hypervisor
קושי והיקף בינוני. מכסה את מושג הרחבות הווירטואליזציה של ה-CPU בלי להיכנס לפרטי instruction set

איך לקרוא את המאמר הזה

מה רוצים לדעת סעיפים לקרוא
היחס בין Windows ל-VMs, הרצת CPU, וחלוקת התפקידים סעיף 1, התמונה הגדולה → סעיף 2, ה-CPU → סעיף 3, partitions
מי מתווך זיכרון ו-I/O של devices סעיף 4, SLAT → סעיף 5, VMBus
ההשפעה על מחשבים שמעולם לא יוצרים VM, ואיך לבדוק את המחשב שלכם סעיף 6, יכולות יומיום ודו-קיום → סעיף 7, איך בודקים

מפת הידע למטה היא רשימת יחסים. בקריאה ראשונה, עקבו אחרי הטקסט מ-סעיף 1, התמונה הגדולה.

ב-diagram, solid line מציינת relation שתמיד מתקיים ו-dashed line מציינת relation מותנה (התנאים מופיעים בהסבר של כל relation ב-detail page). הרשימה המלאה של ה-relations (סה”כ 22, כולל evidence ו-certainty) וההגדרות של ה-concepts המרכזיים נמצאות ב-detail page של ה-knowledge map (ביפנית). Data: JSON-LD / Turtle

1. קודם המסקנה

כששומעים Hyper-V, אולי מדמיינים “תוכנת הרצת VM שיושבת מעל Windows”. המבנה בפועל הוא הפוך.

מרגע שמפעילים Hyper-V ועושים reboot, מי ששולט ב-CPUs ובזיכרון הפיזיים הוא ה-hypervisor, ו-Windows המארח רץ מעליו כ-partition הראשון והמועדף, ה-“root partition”.

hypervisor הוא שכבת תוכנה דקה שנכנסת בין החומרה ל-OS, יוצרת סביבות הרצה מבודדות שנקראות “partitions”, ומתווכת גישה לחומרה.2 Windows המארח נכנס ל-root partition; VMs נכנסים ל-child partitions.

ה-root partition מטופל באופן מיוחד (יש לו גישה ישירה ל-devices פיזיים ומחזיק את מחסנית הניהול), אבל במובן שהוא אינו שולט ישירות ב-CPUs הפיזיים, הוא עומד באותו מעמד כמו child partition.

המבנה הכולל אחרי הפעלת Hyper-Vה-hypervisor יושב ישירות על החומרה הפיזית, ומעליו יושבים ה-root partition שמחזיק את Windows המארח וה-child partitions שמחזיקים VMsחומרה פיזיתhypervisorroot partition (Windows המארח)child partitions (VMs)מחזיק את מחסנית ניהול הווירטואליזציה ו-device drivers

איור 1: Hyper-V אינו “תוכנת VM מעל Windows” אלא שכבה שנכנסת מתחת ל-Windows, ו-OS המארח עצמו רץ בתוך ה-root partition.

אולי תחשבו, “שום דבר לא מרגיש שונה לפני ואחרי ההפעלה, אז האם באמת התרחש היפוך כזה גדול?” כן. בדיוק לכן המבנה הזה בדרך כלל לא מורגש. במאמר הזה מפרקים את ה-diagram האחד הזה משלושה כיוונים: CPU, זיכרון, ו-I/O של devices.

2. מצד ה-CPU — עוד הרשאה אחת מתחת ל-rings

בדיון ה-CPU מבחינים בין ה-rings שמפרידים את ה-kernel מאפליקציות לבין מצבי ההרצה שמפרידים את ה-hypervisor מאורחים. שאלת הסעיף היא: גם kernel האורח רץ ב-ring 0, אז למה אין התנגשות?

2.1. חזרה על ring protection

ל-CPUs מסוג x64 יש רמות הרשאה (rings), ו-Windows מריץ kernel mode ב-ring 0 ו-user mode ב-ring 3. אפליקציות לא יכולות לגעת בחומרה ישירות כי לא ניתן להריץ הוראות מועדפות מ-ring 3.

אז איך משכנים בבטחה כמה OS kernels, שכל אחד רץ ב-ring 0, על אותו CPU פיזי? כל kernel נכתב בהנחה ש”אני שולט ב-CPU”. תנו ring 0 לכולם והם מתנגשים; תמנעו אותו והם לא ירוצו.

הבעיה של כמה OS kernels שדורשים ring 0גם kernel המארח וגם kernel האורח נכתבו בהנחת סמכות מלאה ב-ring 0, כך שסולם ה-rings המסורתי לבדו אינו יכול לשכן אותם בבטחה על אותו CPU פיזיkernel המארח (מניח ring 0)דורש שליטה ב-CPU הפיזיkernel האורח (מניח ring 0)ה-rings המסורתיים לבדם אינם יכולים ליישב את זהנדרש מתווך מעל ring 0

איור 2: סולם ה-rings נבנה בהנחת OS אחד, ולכן שכנוע כמה kernels צריך עוד הרשאה אחת מעליו.

2.2. הרחבות וירטואליזציה — מצב השמור ל-hypervisor

מה שפותר את הבעיה הזו הוא הרחבות הווירטואליזציה של ה-CPU (Intel VT-x/AMD-V). Hyper-V דורש מעבד שיש לו את היכולת הזו.2 הרחבות הווירטואליזציה מוסיפות, על ציר נפרד מה-rings המסורתיים, “מצב הרצה ל-hypervisor” ו”מצב הרצה לאורחים”. זו הרשאה חזקה אף יותר מ-ring 0, שלפעמים מכנים אותה “ring -1”.

  • kernel האורח ממשיך לרוץ ב-ring 0, כמו קודם. אין צורך בשכתוב.
  • עם זאת, אותו ring 0 הוא “ring 0 בתוך מצב אורח”, והוא אינו שולט ב-CPU הפיזי כולו.
  • כשהאורח פוגע בפעולה מסוימת שדורשת התערבות hypervisor (הוראה שהוגדרה כ-intercept, או exception או הפרה), ה-CPU מעביר שליטה אוטומטית ל-hypervisor (VM Exit). כשה-hypervisor מסיים לטפל, הוא חוזר לאורח (VM Entry). גישות זיכרון רגילות עוברות ישר בלי VM Exit, כל עוד תרגום SLAT מצליח.

גם interrupts עובדים כך. partitions לא נוגעים במעבדים פיזיים ישירות; ה-hypervisor מקבל interrupts ומפנה אותם לכל partition.2

זרימת הרצת אורח ו-VM Exitkernel האורח והאפליקציות רצים ב-ring 0 וב-ring 3 במצב אורח; גישות זיכרון רגילות עוברות דרך תרגום SLAT, בעוד פעולות שהוגדרו כ-intercepts ו-exceptions גורמות ל-VM Exit שמעביר שליטה ל-hypervisor, שמחזיר לאורח דרך VM Entry אחרי הטיפוללאכןרץ במצב אורח (כולל ה-kernel ב-ring 0)פעולה שצריכה התערבות? (intercepts/exceptions שהוגדרו)להמשיך להריץ כמו שזהVM Exit (ה-CPU מעביר שליטה)ה-hypervisor מטפלחזרה לאורח דרך VM Entry

איור 3: OS האורח ממשיך לרוץ ב-ring 0 בלי שכתוב, וה-CPU קורא ל-hypervisor רק כשצריך.

הלוך-ושוב הזה דומה מאוד לזרימה שעקבנו אחריה בסדרת הזיכרון: “נכנסים ל-kernel ב-page fault, ואז חוזרים לאותה הוראה”. ה-CPU לוקח שליטה דרך מנגנון exception או מעבר, נותן למנהל ברמה גבוהה יותר להחליט, ואז חוזר. בעומק של Windows, הצורה הזו מופיעה שוב ושוב.

2.3. Type 1 ו-Type 2 — ההבדל הוא איפה זה יושב

Hypervisors מחולקים בגדול ל-Type 1 (bare-metal), שרץ ישירות על החומרה, ול-Type 2 (hosted), שרץ מעל OS מארח. Hyper-V הוא Type 1.3 VirtualBox ו-VMware Workstation (כשמריצים standalone) מסווגים כ-Type 2.

כששומעים Type 1, נוטים לדמיין “תצורת שרת בלי OS מארח”, אבל Hyper-V שונה. Windows המארח אינו נעלם; הוא “עובר דירה” לתוך ה-root partition. כשמפעילים Hyper-V ועושים reboot, ה-hypervisor עולה קודם בזמן ה-boot, ואז Windows המארח עולה כ-root partition מעליו.

ההבדל בין hypervisors מסוג Type 1 ו-Type 2ב-Type 2 ה-OS המארח יושב על החומרה וה-hypervisor וה-VMs יושבים על ה-OS המארח, ואילו ב-Hyper-V מסוג Type 1 ה-hypervisor יושב ישירות על החומרה וה-OS המארח עצמו נכנס ל-root partition מעליוType 1 (Hyper-V)Type 2 (hosted)hypervisorחומרהroot partition (OS מארח)VMOS מארחחומרהhypervisorVM

איור 4: ב-Type 2 ה-hypervisor יושב על ה-OS המארח, ואילו ב-Hyper-V מסוג Type 1 הסדר הפוך וה-OS המארח עצמו יושב על השכבה צעד אחד מתחת.

על ציר זמן של boot, השינוי שקורה כשמפעילים נראה כך.

סדר boot אחרי הפעלת Hyper-Vאחרי הדלקה, ה-hypervisor עולה קודם בזמן ה-boot, אחר כך Windows המארח עולה כ-root partition מעליו, ו-VMs, VBS וכדומה עולים אחרי זההדלקה ותחילת bootה-hypervisor עולה קודםWindows המארח עולה כ-root partitionVMs, VBS, WSL2 וכדומה עולים מעליוחוויית המשתמש לא משתנה

איור 5: היפוך הסדר כבר הסתיים לפני שמסך ה-logon מופיע, וה-OS המארח עולה על ה-hypervisor מההתחלה.

3. partitions — יחידת הבידוד

מסתכלים מקרוב על partitions, ה”ארגזים” בתמונה הגדולה. מה שרוצים להפריד כאן הוא תיווך CPU וזיכרון, שה-hypervisor מטפל בו ישירות, מ-I/O של devices, שה-root partition בדרך כלל מתווך.

3.1. תפקידים שיש רק ל-root partition

partition היא יחידה לוגית של בידוד שה-hypervisor מספק.2 עם זאת, לא כל partition שווה. יש דברים שיש רק ל-root partition.

גישה ישירה ל-devices פיזיים

device drivers לדיסקים, NICs, GPUs וכדומה חיים ב-Windows שבתוך ה-root partition, לא ב-hypervisor. ל-Hyper-V ב-Windows Server יש תצורה שמקצה PCIe device מסוים ישירות ל-child partition (Discrete Device Assignment); במקרה הזה ה-root מוותר על אותו device (זה אינו זמין ב-Windows ללקוח).4

מחסנית ניהול הווירטואליזציה

VMMS (Virtual Machine Management Service), שמנהל יצירה, הפעלה ועצירה של VMs, ו-worker process שעולה לכל VM (vmwp.exe) רצים ב-user mode ב-root partition.5 אלה חלק מיכולות ניהול ה-VM של Hyper-V, ולכן הם עשויים להיעדר במארח שבו רק ה-hypervisor רץ בשביל VBS או WSL2.

הזכות ליצור child partitions

ה-root partition יוצר child partitions דרך ה-hypercall API (ממשק הקריאה לתוך ה-hypervisor).2

לתכנון הזה יש סיבה. אם שמים כל device driver בתוך ה-hypervisor עצמו, ה-hypervisor הופך ענק ומספר הבאגים ונקודות הכניסה לתקיפה גדל. ה-hypervisor מצמצם את עצמו לעבודה המינימלית של תיווך CPUs וזיכרון, ומשאיר את הטיפול ב-devices ל-Windows שב-root partition. חלוקת התפקידים הזו היא מה ששומר את Hyper-V דק.

חלוקת תפקידים בין root partition ל-child partitionsה-root partition מחזיק את מחסנית ניהול הווירטואליזציה ו-device drivers פיזיים ויוצר child partitions דרך hypercalls; child partition רואה רק devices וירטואליים בתצורה הרגילה, ותחת Discrete Device Assignment ב-Windows Server הוא ניגש ישירות ל-device שהוקצהroot partitionיצירה וניהול דרך hypercallschild partitionguest OSבתצורה הרגילה נראים רק devices וירטואלייםVMMS ו-worker processesdevice drivers פיזייםhypervisor (מצמצם את עצמו לתיווך CPU וזיכרון)

איור 6: שמים device drivers ומחסנית ניהול בצד ה-root partition כדי לשמור את ה-hypervisor עצמו דק.

3.2. העולם כפי שנראה מ-child partition

ה-guest OS ב-child partition אינו יכול לראות חומרה פיזית ישירות בתצורת device וירטואלי רגילה (החריג היחיד הוא device שהוקצה דרך Discrete Device Assignment ב-Windows Server, כפי שתואר בסעיף הקודם). מה שהוא יכול לראות הם virtual processors, מרחב זיכרון שנראה כשלו, ו-devices וירטואליים. בקשות ל-devices וירטואליים מועברות ל-root partition דרך VMBus או ה-hypervisor.2

הקצאת זמן CPU ותרגום זיכרון דרך SLAT, לעומת זאת, מטופלים ישירות על ידי ה-hypervisor בלי לעבור דרך ה-root. מה שה-root מתווך הוא I/O של devices, לא כל משאב פיזי.

העולם כפי שנראה מ-child partitionמה שה-guest OS רואה הוא virtual processors, מרחב זיכרון פרטי ל-partition, ו-devices וירטואליים; בקשות ל-devices וירטואליים מועברות ל-root partition דרך VMBus וכדומה, זמן CPU ותרגום זיכרון מטופלים ישירות על ידי ה-hypervisor, ובתצורת Discrete Device Assignment ב-Windows Server רק ה-devices שהוקצו נגישים ישירותדרך VMBus וכדומהלא נראה ישירותguest OS ב-child partitionvirtual processorsמרחב זיכרון פרטיdevices וירטואלייםמועבר ל-root partitionCPUs פיזיים, RAM ו-devices אמיתייםבתצורת DDA (Windows Server), רק devices שהוקצו נגישים ישירות

איור 7: בתצורת device וירטואלי רגילה כל מה שהאורח רואה הוא חלון וירטואלי והנתיב לפיזי עובר דרך מתווך; רק device שהוקצה ב-DDA ב-Windows Server הוא החריג.

מה שחשוב כאן הוא שלאפליקציה שרצה על Windows המארח, המבנה הזה כמעט שקוף. קריאות Win32 API וטיפול ב-page fault עדיין מעובדים על ידי Windows kernel שבתוך ה-root partition, כמו קודם. ה-hypervisor מתערב רק כשפוגעים ב-intercept או ב-exception שהוגדרו.

4. מצד הזיכרון — לתרגום הכתובות מתווספת עוד רמה

בזיכרון מפרידים את הכתובת שהאורח מחשיב “פיזית” מהמיקום בפועל ב-RAM. מחזיקים את הסדר GVA → GPA → SPA ומי מנהל כל תרגום.

4.1. שלושה סוגי כתובת

בחלק 1 של סדרת הזיכרון עקבנו אחרי הזרימה שבה כתובת וירטואלית מתורגמת דרך טבלת דפים לכתובת פיזית (“Page Fault ב-Windows (חלק 1): מתי כתובת וירטואלית מקבלת RAM פיזי”). בסביבה וירטואלית מתווספת עוד רמה מתחת לתרגום הזה, ויש שלושה סוגי כתובת.

כתובת קיצור מי מנהל
guest virtual address GVA טבלת הדפים של ה-guest OS
guest physical address GPA הכתובת שה-guest OS מאמין שהיא “פיזית”
system physical address SPA ה-hypervisor (המיקום בפועל ב-RAM)

ה-guest OS מתרגם GVA ל-GPA עם טבלת הדפים שלו. עם זאת, ה-GPA שהאורח רואה אינו כתובת פיזית אמיתית; זה מרחב זיכרון פרטי שמוקדש לכל partition.2 מיפוי GPA על המיקום בפועל ב-RAM (SPA) הוא עבודת ה-hypervisor.

4.2. SLAT — תרגום דו-רמתי בחומרה

אם התרגום ברמה השנייה היה נעשה בתוכנה לבדה, ה-hypervisor היה צריך לעקוב אחרי כל עדכון טבלת דפים של האורח אחד-אחד, וזה אינו ריאלי מבחינת ביצועים. לכן ה-CPU מספק מנגנון שעובר על טבלאות התרגום ברמה השנייה בחומרה. זה SLAT (Second Level Address Translation); Intel EPT (Extended Page Tables) ו-AMD RVI הם המימושים.

Hyper-V הנוכחי דורש מעבד 64-bit עם SLAT.4

תרגום כתובות דו-רמתי דרך SLATguest virtual address מתורגם ל-guest physical address בטבלת הדפים של ה-guest OS, ואז מתורגם הלאה ל-system physical address ב-SLAT שה-hypervisor מנהל, ומגיע ל-RAM בפועלטבלת דפים של guest OSSLAT (טבלאות תרגום EPT/RVI)guest virtual address (GVA)guest physical address (GPA)system physical address (SPA)RAM פיזישכבה שהאורח רק מאמין שהיא פיזית

איור 8: טבלת תרגום נוספת, שמנוהלת על ידי ה-hypervisor, יושבת מתחת לטבלת הדפים של האורח, וה-CPU עובר על שתיהן בחומרה.

SLAT אינו יכולת שקיימת רק ליעילות הרצת VM. ה-VBS שנראה בחלק 2 משתמש בתכונה ש”אפשר להחזיק טבלת תרגום SLAT שונה לכל רמת הרשאה” כחומר לגבול אבטחה. הסיבה שאפשר ליצור זיכרון שאפילו ה-kernel לא יכול לראות היא שה-hypervisor מחזיק את התרגום ברמה השנייה. זה קו עלילה לכל הסדרה, אז זוכרים נקודה אחת: “מנהל טבלאות התרגום הוא ה-hypervisor”.

5. מצד I/O של devices — VMBus ושני סוגי device

I/O של devices לוקח נתיב אחר מזמן CPU ותרגום זיכרון. משווים את השיטה שמחקה חומרה אמיתית לשיטה שמשתמשת בנתיב שמיועד לווירטואליזציה.

5.1. גבולות ה-emulated devices

הדרך הקלאסית להראות device ל-child partition היא לחקות במלואה חומרה אמיתית (למשל IDE controller ישן) בתוכנה. התאימות גבוהה כי ה-inbox drivers של ה-guest OS עובדים כמו שהם, אבל VM Exit מתרחש בכל פעם שהאורח דופק על I/O port, והביצועים לא מתרחבים.

למה I/O ל-emulated device איטיבכל פעם שהאורח מפעיל I/O port, השליטה עוברת לצד ה-hypervisor דרך VM Exit, ה-device מחוקה בתוכנה, והשליטה חוזרת לאורח, כך שהלוך-ושוב חוזר והוא איטיחוזר בפעולת הפורט הבאההאורח מפעיל I/O portמתרחש VM Exitה-device מחוקה בתוכנהחזרה לאורח דרך VM Entry

איור 9: הלוך-ושוב הזה רץ פעמים רבות מאחורי גישת דיסק אחת, ומחיר התאימות משולם בביצועים.

5.2. VMBus ו-VSP/VSC — נתיב מהיר שתוכנן לווירטואליזציה

לכן ל-Hyper-V יש מנגנון “synthetic device” שתוכנן בהנחת וירטואליזציה. יש שלושה שחקנים.2

  • VMBus: ערוץ תקשורת לוגי בין partitions. הוא מספק תקשורת בין-partitions מהירה שמשתמשת ב-shared memory.3
  • VSP (Virtualization Service Provider): service שיושב בצד ה-root partition, מקבל בקשות device מהילד, וגשר אותן למחסנית ה-device/backend בצד ה-root. בקשה עשויה להגיע ל-device פיזי, או להיות מטופלת ב-backend בצד המארח כמו virtual disk או virtual switch.
  • VSC (Virtualization Service Consumer): synthetic device driver שנכנס ל-guest OS בצד ה-child partition. הוא שולח בקשות ל-VSP מעל VMBus.

דוגמה: איך WriteFile של אורח מגיע למארח

בקשת אחסון מ-guest OS זורמת בסדר הבא.

  1. ה-WriteFile של אפליקציית האורח יורד במחסנית ה-I/O של kernel האורח.
  2. בתחתית הוא מגיע ל-VSC במקום לחומרה אמיתית.
  3. ה-VSC שם את הבקשה על VMBus ומוסר אותה ל-VSP ב-root partition.
  4. ה-VSP מזרים את הבקשה למחסנית ה-I/O בצד ה-root. בתצורת virtual disk (VHDX) זה מטופל ככתיבה לקובץ VHDX במארח ובסופו של דבר מגיע לדיסק הפיזי.

הגישה הזו נקראת Enlightened I/O (I/O שמודע לווירטואליזציה), והיא מעלה יעילות בעקיפת שכבת ה-emulation של devices.2

נתיב I/O של synthetic deviceבקשת I/O מאפליקציה ב-child partition מגיעה ל-VSC דרך kernel האורח, חוצה VMBus אל VSP ב-root partition, ובמחסנית ה-I/O בצד ה-root שה-VSP מגשר אליה היא עשויה להגיע ל-device אמיתי דרך device driver פיזי, או להיות מטופלת ב-backend בצד המארח כמו virtual disk או virtual switchVMBusאפליקציה ב-child partitionמחסנית I/O של kernel האורחVSC (synthetic device driver)VSP (צד ה-root partition)מחסנית I/O בצד ה-rootdevice driver פיזיbackend בצד המארח (virtual disk, virtual switch וכדומה)device פיזי

איור 10: ב-synthetic device, I/O של האורח חוצה ל-root partition מעל VMBus ו, דרך המחסנית בצד ה-root, מגיע ל-device אמיתי או ל-backend בצד המארח.

כלומר, אם I/O דיסק או רשת של VM מהיר תלוי לא רק בצד האורח אלא גם ב-מצב מחסנית ה-I/O ו-device drivers בצד ה-root partition. הסיבה שתצפית בצד המארח הכרחית כשחוקרים בעיית ביצועים של VM היא שהנתיב באמת עובר דרך המארח.

emulated devices מול synthetic devicesemulated device מחקה חומרה אמיתית כך ש-inbox drivers של האורח עובדים אבל הוא איטי; synthetic device הוא driver ייעודי שמניח VMBus והוא מהירdevice שמוצג ל-child partitionemulated devicesynthetic deviceמחקה חומרה אמיתית; תאימות קודםצריך התערבות בכל I/O; איטיתוכנן סביב VMBus; מהירדורש driver תואם באורח

איור 11: משני סוגי ה-device הווירטואלי, emulated devices נושאים תאימות מיד אחרי התקנת OS, ו-synthetic devices נושאים ביצועים בשימוש יומיומי.

6. למה זה לא בעיית מישהו אחר, גם אם לעולם לא משתמשים ב-VM

6.1. VBS, WSL2 ו-Sandbox משתמשים באותו יסוד

המבנה עד כאן עשוי להיראות כמו “סיפור למי שמעמיד VMs”. כפי שנאמר בפתיחה, עם זאת, ב-Windows הנוכחי ה-hypervisor הוא חלק מחיי היומיום.

  • Virtualization-based security (VBS). הוא משתמש ב-Windows hypervisor כדי ליצור סביבה מבודדת ומשכן שם יכולות אבטחה. ב-Windows 11 הוא מופעל כברירת מחדל כשמתקיימים תנאים כמו התקנה נקייה על חומרה תואמת.1 הפירוט בחלק 2.
  • WSL2. הוא מריץ Linux kernel אמיתית בתוך lightweight utility VM.6
  • Windows Sandbox. סביבת Windows חד-פעמית שמבודדת על ידי ה-hypervisor.7 שניהם מכוסים בחלק 3.
יכולות יומיום שיושבות על אותו hypervisorלא רק VMs של Hyper-V אלא גם VBS, שמופעל כברירת מחדל במכשירים שעומדים בתנאים כמו התקנה נקייה, וגם WSL2 ו-Windows Sandbox, כולם בנויים על אותו Windows hypervisorWindows hypervisorVMs של Hyper-VVBS (מופעל כברירת מחדל בהתקנות נקיות וכדומה)WSL2Windows Sandboxלמה זה רץ גם במחשבים שמעולם לא משתמשים ב-VM

איור 12: יש יסוד אחד, וה-diagram הזה הוא המקום שבו ההנחה “וירטואליזציה היא סיפור למי שמשתמש ב-VMs” מתפרקת.

6.2. דו-קיום עם תוכנות וירטואליזציה של צד שלישי

עוד דבר שאנשים נתקלים בו בפועל הוא דו-קיום עם תוכנות וירטואליזציה של צד שלישי. כי ה-hypervisor משתמש בהרחבות הווירטואליזציה של ה-CPU באופן בלעדי, בסביבה שבה Windows hypervisor רץ, VirtualBox וכדומה אינם יכולים לרוץ בדרך המסורתית (הדרך שמשתמשת בהרחבות הווירטואליזציה של ה-CPU בעצמה).

לשם כך מסופק API ציבורי בשם Windows Hypervisor Platform, ומחסנית וירטואליזציה של צד שלישי יכולה לרוץ בישיבה מעל ה-Windows hypervisor.8 VirtualBox/VMware הנוכחיים יכולים לדור עם WSL2 בזכות המנגנון הזה, אבל הבדלי ביצועים ויכולות שבאים עם החלפת מצב נצפים לפעמים כ”אחרי שהפעלתי Hyper-V (או VBS), תוכנת הווירטואליזציה התחילה להתנהג אחרת”.

מי הבעלים של הרחבות הווירטואליזציה של ה-CPU, והנתיב לתוכנות וירטואליזציה של צד שלישיבזמן ש-Windows hypervisor רץ הוא מחזיק באופן בלעדי את הרחבות הווירטואליזציה של ה-CPU; תוכנות וירטואליזציה של צד שלישי שתומכות ב-WHP רצות מעליו דרך Windows Hypervisor Platform, בעוד מימושים שאינם תומכים ב-WHP אינם יכולים לרוץ או מוגבלים ביכולותלאכןהרחבות וירטואליזציה של CPU (VT-x/AMD-V)האם Windows hypervisor רץ?תוכנת צד שלישי יכולה להשתמש בהן ישירותל-hypervisor שימוש בלעדיWindows Hypervisor Platformתוכנת צד שלישי שתומכת ב-WHP רצה מעליומימושים שאינם תומכים אינם יכולים לרוץ, או מוגבלים

איור 13: יש בעלים אחד להרחבות הווירטואליזציה, ותוכנת הצד השלישי היחידה שיכולה לדור בזמן שה-hypervisor רץ היא תוכנה שתומכת ב-API הציבורי (WHP).

7. ראו זאת בעצמכם

אפשר לבדוק במחשב שלכם אם hypervisor רץ.

7.1. בדיקת ה-hypervisor ו-VBS ב-PowerShell

קודם, בדיקה שאפשר להריץ בלי הרשאות administrator.

# האם אנחנו רצים מעל hypervisor
(Get-CimInstance Win32_ComputerSystem).HypervisorPresent

# מצב VBS (אותו מקור כמו "Virtualization-based security" ב-msinfo32)
Get-CimInstance -Namespace root/Microsoft/Windows/DeviceGuard `
    -ClassName Win32_DeviceGuard |
    Select-Object VirtualizationBasedSecurityStatus

VirtualizationBasedSecurityStatus מחזיר את מצב הריצה של VBS כמספר (2 הוא “Running”).9

זהירות אחת. כל מה ש-HypervisorPresent אומר הוא “האם אנחנו רצים מעל hypervisor”; הוא אינו מבדיל root מ-child. אם מריצים אותו על Windows בתוך VM, הוא עדיין מחזיר True, כ-child partition. אם הוא True על Windows במחשב פיזי, אותו Windows נמצא בתוך ה-root partition; קוראים את זה יחד עם סביבת ההרצה.

7.2. להבדיל “רץ” מ”דרישות מוקדמות” ב-systeminfo

הבא, הקלאסי משורת הפקודה.

systeminfo

מסתכלים על “Hyper-V Requirements” בסוף הפלט. במכונה שבה ה-hypervisor עוד לא רץ, הדרישות הבודדות, כמו תמיכה ב-SLAT והאם הרחבות וירטואליזציה מופעלות, מופיעות אחת-אחת. במכונה שבה ה-hypervisor כבר רץ, במקום הדרישות מתקבלת שורה אחת: “A hypervisor has been detected. Features required for Hyper-V will not be displayed.”4

השורה האחת הזו היא לכן הצהרה ש-Windows שלכם רץ מעל איזה hypervisor. כמו ב-HypervisorPresent, צריך לקרוא את זה כ”בתוך ה-root partition” במחשב פיזי, או “כ-child partition” בתוך VM.

גם אם כל דרישת systeminfo היא “Yes”, זה אומר רק שצד החומרה מוכן. יכולת Hyper-V עצמה זמינה במהדורות Pro, Enterprise ו-Education, ואינה ב-Home.10

7.3. כשבודקים במסך, מבחינים איזה פריט בודקים

ב-GUI, בודקים את שורת “Virtualization-based security” תחת “System Summary” ב-msinfo32. שימו לב ש-“Virtualization: Enabled” בחלונית ה-CPU של Task Manager מראה רק אם הרחבות וירטואליזציה מופעלות ב-firmware, וזה מידע נפרד מזה אם hypervisor רץ.

איך בודקים אם ה-hypervisor רץאם systeminfo אומר שזוהה hypervisor אתם רצים על hypervisor (בתוך ה-root partition במחשב פיזי); אם מופיעה רשימת Hyper-V Requirements הוא עוד לא רץ ולכן בודקים כל דרישה כמו SLAT, VM Monitor Mode Extensions ו-DEP, אבל כל Yes אומר רק שצד החומרה מוכן וליכולת Hyper-V יש גם דרישת מהדורהA hypervisor has been detectedהדרישות מופיעות ברשימההכול Yesיש Noלהריץ systeminfoמה מראה שדה Hyper-V Requirements?ה-hypervisor רץ (בתוך ה-root במחשב פיזי)ה-hypervisor עוד לא רץכל הדרישות Yes?צד החומרה מוכןHyper-V צריך גם Pro/Enterprise/Educationלבדוק את הפריטים הרלוונטיים ב-UEFI/BIOS וכדומה

איור 14: שדה “Hyper-V Requirements” ב-systeminfo ממלא גם בדיקת מצב ריצה וגם בדיקת דרישות מוקדמות.

8. שלוש קריאות שגויות להימנע מהן בפועל

8.1. “לא הפעלנו Hyper-V, אז לווירטואליזציה אין קשר למחשבים שלנו”

גם אם לא הפעלתם את יכולת Hyper-V (כלי הניהול וסביבת הרצת ה-VM), ה-Windows hypervisor רץ אם VBS מופעל. כשחוקרים בעיית תאימות driver, בדיקת ביצועים, או תקלה בתוכנת וירטואליזציה של צד שלישי, בודקים HypervisorPresent ואת מצב הריצה של VBS, לא אם היכולת מופעלת.

8.2. “Task Manager אומר Virtualization: Enabled, אז Hyper-V רץ”

התצוגה הזו היא על הגדרת firmware (אם VT-x/AMD-V זמין). שופטים את מצב הריצה של ה-hypervisor מ-“A hypervisor has been detected” ב-systeminfo. ולהפך, אם Task Manager אומר “Disabled”, אי אפשר להפעיל גם Hyper-V וגם WSL2, אז בודקים קודם את הגדרות UEFI/BIOS.

שלוש בדיקות שקל לבלבלשדה Virtualization ב-Task Manager מראה את הגדרת ה-firmware, רשימת Windows Features מראה את מצב ההתקנה, ו-systeminfo או HypervisorPresent מראים את מצב הריצה; כל אחד עונה על שאלה אחרתמה רוצים לדעת?האם הרחבות וירטואליזציה מופעלות ב-firmware?האם יכולת Hyper-V הותקנה?האם ה-hypervisor רץ עכשיו?חלונית ה-CPU ב-Task Managerדיאלוג Windows Featuressysteminfo ו-HypervisorPresent

איור 15: אלה שלוש שאלות עצמאיות, והסקת השתיים האחרות מתצוגה אחת היא קריאה שגויה.

8.3. “אם ה-VM איטי, זו בעיית guest OS”

I/O של synthetic device חוצה VMBus אל VSP ב-root partition ועובר במחסנית ה-device/backend בצד ה-root (drivers פיזיים, ועוד עיבוד virtual switch ו-virtual disk). אם מסתכלים רק על counters בתוך האורח, לא תמצאו צוואר בקבוק שיושב באחסון או ב-NIC בצד המארח. העיקרון לבעיות ביצועים של VM הוא לצפות משני הצדדים: האורח והמארח (ה-root partition).

9. סיכום

  • כשמפעילים Hyper-V, ה-hypervisor רץ ישירות על החומרה ו-Windows המארח רץ כ-root partition.2
  • kernel של ה-guest OS ממשיך לרוץ ב-ring 0, ורק פעולות שהוגדרו כ-intercepts, ועוד exceptions, מועברות ל-hypervisor דרך VM Exit. גישות זיכרון רגילות עוברות דרך תרגום SLAT.
  • רק ה-root partition מחזיק device drivers פיזיים ואת מחסנית ניהול הווירטואליזציה, והוא יוצר child partitions דרך hypercalls.2
  • הזיכרון הופך לתרגום דו-רמתי GVA→GPA→SPA, והרמה השנייה מטופלת בחומרה על ידי SLAT (EPT/RVI). Hyper-V הנוכחי דורש SLAT.4
  • I/O של devices נשלט על ידי נתיב ה-synthetic device VSC→VMBus→VSP, והביצועים תלויים גם במחסנית ה-I/O בצד המארח.2
  • ב-Windows 11, כי VBS מופעל כברירת מחדל במכשירים שעומדים בתנאים כמו התקנה נקייה, זה לא חריג שה-hypervisor רץ גם במחשב שמעולם לא משתמש ב-VM.1 אפשר לבדוק את מצב הריצה עם HypervisorPresent ועם systeminfo.

התמונה הגדולה של חלק 1 מתכנסת ל-diagram האחד הזה.

התמונה הגדולה של חלק 1ה-hypervisor יושב מתחת ל-root partition ול-child partitions; CPUs מוקצים בתיזמון virtual processors (VM Exits רק ב-intercepts ו-exceptions שהוגדרו), הזיכרון מתווך בתרגום SLAT דו-רמתי, I/O של synthetic device מועבר מעל VMBus ומטופל על ידי VSP של ה-root partition, ול-emulated devices ול-Discrete Device Assignment יש נתיבים אחריםroot partition ו-child partitionshypervisorCPU: מקצה virtual processorsזיכרון: תרגום דו-רמתי דרך SLATdevices: I/O סינתטי מועבר מעל VMBusVM Exit רק בהתערבותמטופל על ידי VSP בצד ה-rootemulated devices ו-DDA לוקחים נתיבים אחרים

איור 16: תיזמון CPU ותרגום זיכרון מטופלים ישירות על ידי ה-hypervisor (VM Exits רק בהתערבות), ו-I/O של synthetic device מתווך על ידי ה-root partition (ה-VSP) מעבר ל-VMBus.

ההמשך בחלק 2, “זיכרון שאפילו ה-kernel לא רואה — VBS, HVCI ו-Credential Guard”.

אוספים את קו העלילה של המאמר הזה, שה-hypervisor מחזיק את טבלאות התרגום של SLAT, ועוקבים אחרי איך Windows יוצר “זיכרון שלא administrator ולא kernel יכולים לקרוא”.

מאמרים קשורים

תחומי ייעוץ קשורים

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

קישורים

  1. Microsoft Learn, Silicon assisted security. על כך ש-VBS משתמש בווירטואליזציה בחומרה כדי לבודד את Secure Kernel מה-OS הרגיל, ועל כך ש-VBS ו-HVCI מופעלים כברירת מחדל במכשירים שעומדים בדרישות המוקדמות בהתקנה חדשה של Windows 11. ↩ ↩2 ↩3

  2. Microsoft Learn, Hyper-V Architecture. על כך שה-hypervisor מספק partitions כיחידת בידוד; שה-root partition יוצר child partitions דרך ה-hypercall API; ש-partitions רצים במרחב זיכרון וירטואלי פרטי בלי גישה ישירה למעבדים פיזיים; על התפקידים של VMBus, VSP, VSC ו-Enlightened I/O; ועל כך שנדרשות הרחבות וירטואליזציה בחומרה (Intel VT/AMD-V). ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12

  3. Microsoft Learn, Hyper-V architecture (Performance Tuning). על כך ש-Hyper-V הוא hypervisor מסוג Type 1, שה-root partition מחזיק devices של I/O פיזיים, ועל כך ש-VMBus מספק תקשורת בין-partitions בעלת ביצועים גבוהים שמשתמשת ב-shared memory. ↩ ↩2

  4. Microsoft Learn, System requirements for Hyper-V on Windows and Windows Server. על כך שנדרשים מעבד 64-bit עם SLAT ו-VM Monitor Mode Extensions; על היכולת לאשר שדרישות מתקיימות בשדה “Hyper-V Requirements” של systeminfo; על כך שמוצג “A hypervisor has been detected” בזמן ש-hypervisor רץ; ועל כך ש-Discrete Device Assignment יכול להקצות device מסוים ישירות ל-child partition. ↩ ↩2 ↩3 ↩4

  5. Microsoft Learn, Appendix B: Hyper-V Architecture and Feature Overview. על כך ש-VMMS (Virtual Machine Management Service) מנהל את מצב ה-VMs ב-child partitions, ועל כך ש-worker process (VMWP) עולה ב-user mode ב-root partition לכל VM. ↩

  6. Microsoft Learn, Comparing WSL Versions. על כך ש-WSL2 מריץ Linux kernel אמיתית בתוך lightweight utility VM, ועל אזהרות לגבי שימוש יחד עם VMware ו-VirtualBox הנוכחיים. ↩

  7. Microsoft Learn, Windows Sandbox architecture. על כך ש-Windows Sandbox הוא סביבת Windows קלת-משקל שמשלבת טכנולוגיית containers עם בידוד על ידי hypervisor. ↩

  8. Microsoft Learn, Windows Hypervisor Platform. על כך שמסופק user-mode API כדי שמחסנית וירטואליזציה של צד שלישי תוכל ליצור ולנהל partitions מעל ה-Windows hypervisor. ↩

  9. Microsoft Learn, Enable Hotpatch for Azure Arc-enabled servers. על היכולת לבדוק את מצב הריצה של VBS (virtual secure mode) דרך VirtualizationBasedSecurityStatus במחלקה Win32_DeviceGuard. ↩

  10. Microsoft Learn, Install Hyper-V. על כך שאפשר להפעיל Hyper-V ב-Windows 10/11 Pro או Enterprise וכדומה, ועל כך שאי אפשר להתקין אותו במהדורת Home. ↩

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

העמודים האלה ממקמים את הנושא בהקשר רחב יותר של שירותים והחלטות.

המאמר קשור ישירות לשירותים הבאים.

שאלות נפוצות

שאלות נפוצות בפניות בנושא המאמר.

כשמפעילים Hyper-V, איפה Windows המארח באמת רץ?
ה-hypervisor לוקח שליטה ישירה על אופן הקצאת CPUs וזיכרון פיזיים, ו-Windows המארח רץ בתוך partition מיוחד שנקרא root partition. השליטה ב-devices פיזיים מטופלת בדרך כלל על ידי drivers בצד ה-root partition. ה-root partition מחזיק את ה-drivers ואת מחסנית ניהול הווירטואליזציה, אבל הבעלות על ה-CPUs הפיזיים שייכת ל-hypervisor.
האם Virtualization: Enabled ב-Task Manager אומר ש-Hyper-V רץ?
לא. התצוגה הזו מראה אם הרחבות הווירטואליזציה של ה-CPU (Intel VT-x/AMD-V) מופעלות ב-firmware. כדי לראות אם hypervisor באמת רץ, חפשו A hypervisor has been detected ב-systeminfo, או בדקו את Win32_ComputerSystem.HypervisorPresent.
למה ה-hypervisor רץ אף שמעולם לא יצרתי virtual machine?
ב-Windows 11, Virtualization-based security (VBS) מופעל כברירת מחדל במכשירים שעומדים בתנאים, למשל התקנה נקייה על חומרה תואמת, ו-VBS בנוי על ה-Windows hypervisor. אותו דבר אם משתמשים ב-WSL2 או ב-Windows Sandbox. זה לא חריג שה-hypervisor רץ בלי קשר לכך שמישהו משתמש ב-virtual machines.
מהו SLAT, ולמה Hyper-V דורש אותו?
SLAT (Second Level Address Translation) הוא המנגנון שבו ה-CPU מתרגם guest physical addresses לכתובות פיזיות אמיתיות; Intel EPT ו-AMD RVI הם המימושים. בלי זה ה-hypervisor היה צריך לתחזק את טבלאות התרגום בתוכנה, וזה לא ריאלי מבחינת ביצועים, ולכן Hyper-V הנוכחי מתייחס אליו כדרישה קשיחה.
אם אפעיל Hyper-V, VirtualBox ו-VMware יפסיקו לעבוד?
מכיוון שה-hypervisor משתמש בהרחבות הווירטואליזציה של ה-CPU באופן בלעדי, hypervisor צד שלישי לא יכול לרוץ בדרך המסורתית. עם זאת, ל-VirtualBox ול-VMware הנוכחיים יש מצב שרץ מעל ה-Windows hypervisor (דרך Windows Hypervisor Platform), כך שגרסאות עדכניות של כל אחד יכולות לדור בכפיפה אחת.

פרופיל הכותב

עמוד היכרות עם כותב המאמר.

Go Komura

מנהל KomuraSoft LLC

מתמחה בפיתוח תוכנה עבור Windows, ייעוץ טכני וחקירת תקלות, בעיקר בפרויקטים עם מערכות קיימות ובאגים שקשה לשחזר.

קישורים ציבוריים

חזרה לבלוג