97 lines
8.1 KiB
XML
97 lines
8.1 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="902" height="448" viewBox="0 0 902 448" role="img" aria-labelledby="diagram-title diagram-description">
|
|
<title id="diagram-title">세 fault 는 변환 사슬의 서로 다른 단계에서 갈라져 나가 서로 다른 계층이 받는다</title>
|
|
<desc id="diagram-description">위에서 아래로 읽는다. 맨 위 왼쪽에 Guest Page Table 이 있고 거기서 갈래가 둘이다. 하나는 Guest Page Fault 로 Guest Kernel 에 빠지고, 다른 하나는 GPA 를 들고 아래 EPT 로 내려간다. EPT 에서도 갈래가 나뉘어 EPT Violation 은 VM Exit 을 거쳐 KVM 으로 간다. 맨 위 오른쪽에는 QEMU 의 Guest RAM Backing 이 따로 있고 그쪽 갈래인 Host Page Fault 는 Host Kernel 로 간다. 받는 자리의 이름이 그대로 계층 이름이다 — Guest Kernel · KVM · Host Kernel. QEMU 갈래가 EPT 갈래와 선으로 이어져 있지 않은 것은 근거 문서가 둘을 잇는 문장을 두지 않았기 때문이다. 다섯 원인이 무엇인지와 두 사건을 항목별로 견주는 것은 본문의 표가 맡는다.</desc>
|
|
<metadata>{"techviz":{"spec_version":"1.1","id":"page-fault-layers-in-a-vm","profile":"component-flow"},"source_context":{"document":"docs/virtualization/final/document.md","document_sha256":"8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210","anchor":{"kind":"heading","value":"48. Guest Page Fault와 EPT Violation 비교","line":2493}},"evidence_policy":"Each factual element cites source lines or is marked assumption.","diagram_only":true}</metadata>
|
|
<defs>
|
|
<marker id="arrow" viewBox="0 0 10 10" refX="9" refY="5" markerWidth="7" markerHeight="7" orient="auto-start-reverse">
|
|
<path d="M 0 0 L 10 5 L 0 10 z" />
|
|
</marker>
|
|
<style>
|
|
:root { color-scheme: light; }
|
|
text { font-family: Inter, Pretendard, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; fill: #111827; }
|
|
.canvas { fill: #ffffff; }
|
|
.group-box { fill: #ffffff; stroke: #9ca3af; stroke-width: 1.4; stroke-dasharray: 7 5; }
|
|
.group-label-bg { fill: #ffffff; }
|
|
.group-label { font-size: 13px; font-weight: 650; fill: #374151; }
|
|
.edge { fill: none; stroke: #374151; stroke-width: 1.8; stroke-linejoin: round; stroke-linecap: round; marker-end: url(#arrow); }
|
|
.edge.style-dashed, .edge.semantic-dashed, .edge.assumption { stroke-dasharray: 7 5; }
|
|
.edge.style-dotted { stroke-dasharray: 2 5; }
|
|
.edge.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.edge.emphasis-muted { stroke: #9ca3af; }
|
|
.edge.emphasis-warning, .edge.kind-failure, .edge.kind-error { stroke: #dc2626; stroke-width: 2.2; }
|
|
.edge-label-bg { fill: #ffffff; }
|
|
.edge-label { font-size: 12px; font-weight: 560; text-anchor: middle; }
|
|
.node-shape { fill: #ffffff; stroke: #4b5563; stroke-width: 1.7; }
|
|
.node-shape.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.node-shape.emphasis-muted { stroke: #9ca3af; fill: #f9fafb; }
|
|
.node-shape.emphasis-warning { stroke: #d97706; stroke-width: 2; fill: #fffdf5; }
|
|
.node-shape.kind-database, .node-shape.kind-datastore, .node-shape.kind-storage { fill: #f8fafc; }
|
|
.node-shape.kind-queue, .node-shape.kind-event, .node-shape.kind-topic { fill: #fafafa; }
|
|
.node-shape.assumption { stroke-dasharray: 4 4; }
|
|
.storage-bottom, .controller-divider { fill: none; stroke: #4b5563; stroke-width: 1.4; }
|
|
.controller-led { fill: #4b5563; }
|
|
.actor-symbol { fill: none; stroke: #4b5563; stroke-width: 1.8; stroke-linecap: round; }
|
|
.actor-symbol.emphasis-primary { stroke: #2563eb; stroke-width: 2.2; }
|
|
.node-label { font-size: 14px; font-weight: 650; text-anchor: middle; }
|
|
.node-role { font-size: 10px; letter-spacing: 0.04em; text-anchor: middle; fill: #6b7280; }
|
|
.node-detail-divider { stroke: #d1d5db; stroke-width: 1; }
|
|
.node-detail { font-size: 11px; fill: #374151; }
|
|
.assumption-badge { font-size: 9px; font-weight: 700; fill: #92400e; }
|
|
.failure-mark { stroke: #dc2626; stroke-width: 4; stroke-linecap: round; }
|
|
.lifeline { stroke: #9ca3af; stroke-width: 1.2; stroke-dasharray: 5 5; }
|
|
.timeline-axis { stroke: #374151; stroke-width: 1.8; marker-end: url(#arrow); }
|
|
.timeline-stem { stroke: #6b7280; stroke-width: 1.3; }
|
|
.timeline-marker { fill: #ffffff; stroke: #374151; stroke-width: 1.7; }
|
|
.timeline-marker.primary { fill: #2563eb; stroke: #2563eb; }
|
|
.timeline-marker.warning { fill: #dc2626; stroke: #dc2626; }
|
|
.timeline-label { font-size: 13px; font-weight: 650; text-anchor: middle; }
|
|
.timeline-detail { font-size: 11px; fill: #4b5563; text-anchor: middle; }
|
|
</style>
|
|
</defs>
|
|
<rect class="canvas" width="902" height="448" />
|
|
<polyline class="edge kind-event style-solid emphasis-normal semantic-dashed" points="547.0,95.5 627.0,95.5 627.0,231.5 707.0,231.5" data-evidence="2480-2486,2500-2500" />
|
|
<rect class="edge-label-bg" x="565.0" y="149.5" width="172.1" height="22" rx="3" />
|
|
<text class="edge-label" x="651.0" y="164.5">EPT Violation · VM Exit</text>
|
|
<polyline class="edge kind-event style-solid emphasis-normal semantic-dashed" points="228.5,159.0 312.8,159.0 312.8,235.0 397.0,235.0" data-evidence="2497-2500,2506-2507" />
|
|
<rect class="edge-label-bg" x="297.6" y="183.0" width="78.3" height="22" rx="3" />
|
|
<text class="edge-label" x="336.8" y="198.0">Guest #PF</text>
|
|
<polyline class="edge kind-event style-solid emphasis-normal semantic-dashed" points="237.0,303.0 317.0,303.0 317.0,371.0 397.0,371.0" data-evidence="2530-2538" />
|
|
<rect class="edge-label-bg" x="305.2" y="323.0" width="71.6" height="22" rx="3" />
|
|
<text class="edge-label" x="341.0" y="338.0">Host #PF</text>
|
|
<polyline class="edge kind-data style-solid emphasis-normal" points="228.5,141.0 312.8,141.0 312.8,95.5 397.0,95.5" data-evidence="2474-2480" />
|
|
<rect class="edge-label-bg" x="314.8" y="104.2" width="44.0" height="22" rx="3" />
|
|
<text class="edge-label" x="336.8" y="119.2">GPA</text>
|
|
<g id="node-guest-page-table">
|
|
<rect class="node-shape kind-component emphasis-normal role-source" data-evidence="2456-2458,2497-2498" x="78.5" y="114.5" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="153.5" y="141.5">Guest Page Table</text>
|
|
<line class="node-detail-divider" x1="92.5" y1="162.5" x2="214.5" y2="162.5" />
|
|
<text class="node-detail" x="94.5" y="179.5">GVA → GPA</text>
|
|
</g>
|
|
<g id="node-qemu-backing">
|
|
<rect class="node-shape kind-store emphasis-normal role-source" data-evidence="2517-2517,2527-2532" x="70.0" y="257.5" width="167.0" height="91.0" rx="7" />
|
|
<text class="node-label" x="153.5" y="284.5">QEMU · Guest RAM</text>
|
|
<text class="node-label" x="153.5" y="302.5">Backing</text>
|
|
<line class="node-detail-divider" x1="84.0" y1="323.5" x2="223.0" y2="323.5" />
|
|
<text class="node-detail" x="86.0" y="340.5">Host Virtual Memory</text>
|
|
</g>
|
|
<g id="node-ept">
|
|
<rect class="node-shape kind-component emphasis-primary role-service" data-evidence="2478-2482,2497-2498" x="397.0" y="60.0" width="150.0" height="71.0" rx="7" />
|
|
<text class="node-label" x="472.0" y="87.0">EPT</text>
|
|
<line class="node-detail-divider" x1="411.0" y1="108.0" x2="533.0" y2="108.0" />
|
|
<text class="node-detail" x="413.0" y="125.0">GPA → HPA</text>
|
|
</g>
|
|
<g id="node-guest-kernel">
|
|
<rect class="node-shape kind-service emphasis-normal role-sink" data-evidence="2500-2500,2506-2507" x="397.0" y="203.0" width="150.0" height="64.0" rx="7" />
|
|
<text class="node-label" x="472.0" y="233.0">Guest Kernel</text>
|
|
</g>
|
|
<g id="node-host-kernel">
|
|
<rect class="node-shape kind-service emphasis-normal role-sink" data-evidence="2534-2538" x="397.0" y="339.0" width="150.0" height="64.0" rx="7" />
|
|
<text class="node-label" x="472.0" y="369.0">Host Kernel</text>
|
|
</g>
|
|
<g id="node-kvm">
|
|
<rect class="node-shape kind-service emphasis-normal role-sink" data-evidence="2484-2486,2500-2500" x="707.0" y="199.5" width="150.0" height="64.0" rx="7" />
|
|
<text class="node-label" x="782.0" y="229.5">KVM</text>
|
|
</g>
|
|
</svg>
|