refactor: 문서 개선 중
This commit is contained in:
+35
-35
@@ -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 경로는 다른 물음이라 이 그림에 섞지 않는다."
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user