refactor: 문서 개선 중

This commit is contained in:
donghyeon-ka
2026-09-21 14:30:55 +09:00
parent c93cdea150
commit 805a18f486
1497 changed files with 525837 additions and 59152 deletions
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -4,7 +4,7 @@
"title": "Guest 의 메모리 접근 한 번은 이름이 두 번 바뀌며 네 계층을 지난다",
"question": "Guest 프로세스가 읽은 주소는 어느 계층을 차례로 지나 어떤 물리 메모리에 닿는가",
"type": "data-flow",
"direction": "TB",
"direction": "LR",
"audience": [
"가상 머신에 준 RAM 이 Host RAM 에서 무엇을 뜻하는지 가르려는 사람",
"KVM/QEMU 메모리 경로를 처음 읽는 사람"
@@ -14,11 +14,11 @@
"long_description": "위에서 아래로 읽는다. 맨 위 Guest 구역 안에 Keycloak · PostgreSQL 이 있고 그 접근은 GVA 로 Guest TLB 에 들어간다. TLB 에 변환이 없으면 TLB Miss 로 Guest Page Table 을 조회하고 거기서 GVA 가 GPA 가 된다. 그 GPA 는 VM Boundary 를 넘어 Guest 구역 밖의 EPT 로 가고 EPT 가 GPA 를 HPA 로 바꾼다. HPA 는 Host RAM 구역의 Host Physical Memory 에 닿고, 그 physical page 는 맨 아래에서 NUMA Node 0 또는 NUMA Node 1 가운데 한쪽에 놓인다. 상자 안 작은 글씨는 그 단계가 어느 계층인지와 무엇을 무엇으로 바꾸는지를 적은 것이다. 어느 단계에서 접근이 완료되지 못할 때 무엇이 일어나는지와 QEMU 가 이 경로를 어떻게 준비하는지는 본문의 문단과 표가 맡는다.",
"source_context": {
"document": "docs/virtualization/final/document.md",
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
"document_sha256": "8c4ecc64c8cea9a4450ed7131fdd9cb2048dc092b66cd969f6346ed77887c210",
"anchor": {
"kind": "heading",
"value": "87. 최종 기준 그림",
"line": 4029
"line": 4042
}
},
"composition": {
@@ -38,8 +38,8 @@
"description": "VM Boundary 안쪽. Guest Userspace 와 Guest Kernel 이 여기 있고 GVA 가 GPA 가 되는 첫 번째 변환이 여기서 끝난다.",
"evidence": [
{
"start_line": 4034,
"end_line": 4053
"start_line": 4047,
"end_line": 4066
}
],
"assumption": false
@@ -51,8 +51,8 @@
"description": "변환이 끝난 주소가 닿는 실제 서버 메모리.",
"evidence": [
{
"start_line": 4069,
"end_line": 4079
"start_line": 4082,
"end_line": 4092
}
],
"assumption": false
@@ -69,8 +69,8 @@
"description": "Guest 안에서 메모리를 읽는 프로세스. 여기서 GVA 가 출발한다.",
"evidence": [
{
"start_line": 4034,
"end_line": 4038
"start_line": 4047,
"end_line": 4051
}
],
"assumption": false,
@@ -88,8 +88,8 @@
"description": "최근 변환 결과를 담아 두는 CPU 안의 캐시.",
"evidence": [
{
"start_line": 4043,
"end_line": 4045
"start_line": 4056,
"end_line": 4058
}
],
"assumption": false,
@@ -107,8 +107,8 @@
"description": "GVA 를 GPA 로 바꾸는 첫 번째 변환 표.",
"evidence": [
{
"start_line": 4048,
"end_line": 4053
"start_line": 4061,
"end_line": 4066
}
],
"assumption": false,
@@ -127,8 +127,8 @@
"description": "VM Boundary 바깥에서 GPA 를 HPA 로 바꾸는 두 번째 변환 표. KVM 과 CPU 가 맡는다.",
"evidence": [
{
"start_line": 4055,
"end_line": 4067
"start_line": 4068,
"end_line": 4080
}
],
"assumption": false,
@@ -147,8 +147,8 @@
"description": "HPA 가 가리키는 실제 서버 메모리.",
"evidence": [
{
"start_line": 4069,
"end_line": 4072
"start_line": 4082,
"end_line": 4085
}
],
"assumption": false
@@ -163,8 +163,8 @@
"description": "physical page 가 놓일 수 있는 한쪽 NUMA node.",
"evidence": [
{
"start_line": 4073,
"end_line": 4075
"start_line": 4086,
"end_line": 4088
}
],
"assumption": false
@@ -179,8 +179,8 @@
"description": "physical page 가 놓일 수 있는 다른 쪽 NUMA node.",
"evidence": [
{
"start_line": 4073,
"end_line": 4075
"start_line": 4086,
"end_line": 4088
}
],
"assumption": false
@@ -196,8 +196,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4036,
"end_line": 4043
"start_line": 4049,
"end_line": 4056
}
],
"assumption": false
@@ -211,8 +211,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4043,
"end_line": 4048
"start_line": 4056,
"end_line": 4061
}
],
"assumption": false
@@ -226,8 +226,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4053,
"end_line": 4062
"start_line": 4066,
"end_line": 4075
}
],
"assumption": false
@@ -241,8 +241,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4062,
"end_line": 4071
"start_line": 4075,
"end_line": 4084
}
],
"assumption": false
@@ -256,8 +256,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4071,
"end_line": 4075
"start_line": 4084,
"end_line": 4088
}
],
"assumption": false
@@ -271,8 +271,8 @@
"style": "solid",
"evidence": [
{
"start_line": 4071,
"end_line": 4075
"start_line": 4084,
"end_line": 4088
}
],
"assumption": false
@@ -280,6 +280,6 @@
],
"legend": [],
"metadata": {
"rationale": "data-flow 로 고른 이유는 이 절이 답하는 물음이 「주소 하나가 어디를 지나 어디에 닿는가」이기 때문이다. LR 로 세우면 캔버스가 1889px 에 종횡비 5.37 이라 문서 폭에서 글자가 읽히지 않아 TB 로 세웠다. Guest Userspace · Guest Kernel · KVM / CPU · Host RAM 넷을 모두 group 으로 두면 group 이름이 그 경계를 넘는 엣지 라벨에 먹혀 「Guest Kerne」·「KVM / CP」로 잘렸다. 그래서 경계는 VM Boundary 를 사이에 둔 Guest 와 Host RAM 둘만 상자로 두고, 나머지 두 계층 이름은 그 자리 노드의 details 로 내렸다. SSOT 가 같은 절에 그린 관리 경로(virsh · libvirt · QEMU · KVM)와 자원 압박 경로는 다른 물음이라 이 그림에 지 않았다. §87 이 EPT 옆에 적어 둔 「EPT Violation 가능」과 Guest Page Table 옆의 「Guest #PF 가능」도 뺐다 — 이 기록의 본문은 정상 경로를 세우고, 세 계층의 fault 는 짝이 되는 기록이 맡는다. 마지막 Physical RAM 상자는 Host Physical Memory 와 뜻이 겹쳐 빼고 NUMA node 둘을 끝으로 두었다."
"rationale": "data-flow 로 고른 이유는 이 절이 답하는 물음이 「주소 하나가 어디를 지나 어디에 닿는가」이기 때문이다. 현재 renderer에서는 LR이 Guest → EPT → Host RAM 변환 사슬과 마지막 NUMA 분기를 겹침 없이 읽게 한다. Guest Userspace · Guest Kernel · KVM / CPU · Host RAM 넷을 모두 group 으로 두면 경계 라벨이 엣지와 충돌하므로, VM Boundary 를 사이에 둔 Guest 와 Host RAM 둘만 상자로 두고 나머지 계층은 node details 로 남겼다. SSOT 의 관리 경로와 fault 경로는 다른 물음이라 이 그림에 지 않다."
}
}
}