Repository navigation
Expand file tree
/
Copy pathhow-it-works.html
More file actions
259 lines (235 loc) · 35.4 KB
/
Copy pathhow-it-works.html
File metadata and controls
259 lines (235 loc) · 35.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
---
layout: default
title: "How It Works"
description: "How Multikernel works: one machine partitioned into independent Linux kernels, how they are launched with kexec, and how they share memory and devices."
permalink: /how-it-works.html
i18n: true
---
<main>
<section class="hero">
<div class="hero-container">
<div class="hero-badge">
<i data-lucide="route"></i>
<span>How It Works</span>
</div>
<h1>One Machine, Many Kernels</h1>
<p class="subtitle">Multikernel runs several independent Linux kernels on the same physical server at the same time. Each kernel owns its own cores, memory, and devices, and there is no hypervisor underneath any of them. This page walks through how that happens, without the deep details.</p>
<div class="button-group">
<a href="/technology.html" class="btn btn-primary">
<i data-lucide="layers"></i>
Full Architecture
</a>
<a href="/getting-started.html" class="btn btn-secondary">
<i data-lucide="rocket"></i>
Try It
</a>
</div>
</div>
</section>
<section id="picture" class="value-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">The Big Picture</h2>
<p class="section-subtitle">A normal server runs one Linux kernel that owns every core, every byte of memory, and every device. Multikernel divides that machine into kernel domains. Each domain is a complete Linux kernel with a dedicated share of the hardware: its own cores, its own memory, and whichever devices you assign to it. The kernels are peers. None of them is a host, a guest, or a hypervisor.</p>
</div>
<div class="partition-figure">
<div class="partition-title">One Server · Divided Into Kernel Domains</div>
<div class="partition-domains">
<div class="partition-domain domain-app">
<div class="partition-cores">
{% for i in (1..16) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">Kernel A</div>
<div class="partition-detail">16 cores · NIC 0</div>
</div>
<div class="partition-domain domain-app shade-2">
<div class="partition-cores">
{% for i in (1..16) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">Kernel B</div>
<div class="partition-detail">16 cores · NVMe 0</div>
</div>
<div class="partition-domain domain-app">
<div class="partition-cores">
{% for i in (1..12) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">Kernel C</div>
<div class="partition-detail">12 cores · GPU 0</div>
</div>
<div class="partition-domain domain-app shade-2">
<div class="partition-cores">
{% for i in (1..8) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">Kernel D</div>
<div class="partition-detail">8 cores · no devices</div>
</div>
</div>
<p class="partition-caption">Every box is a complete, unmodified Linux kernel. <strong>They share the machine, not a kernel.</strong></p>
</div>
</div>
</section>
<section id="steps" class="how-it-works">
<div class="section-container">
<div class="section-header">
<div class="section-badge">
<i data-lucide="list-ordered"></i>
<span>Step by Step</span>
</div>
<h2 class="section-title">From Boot to Running Workload</h2>
<p class="section-subtitle">Five steps, all built on mechanisms Linux already has.</p>
</div>
<div class="partition-figure lifecycle-diagram">
<div class="partition-title">Kernel Lifecycle · One Server Over Five Steps</div>
<svg viewBox="0 0 936 282" width="100%" role="img" aria-label="Kernel lifecycle" font-family="'IBM Plex Mono', 'JetBrains Mono', Consolas, monospace"><defs><pattern id="shared" width="6" height="6" patternUnits="userSpaceOnUse" patternTransform="rotate(45)"><rect width="6" height="6" fill="#c9a13e"/><rect width="3" height="6" fill="#4d88b4"/></pattern></defs><defs><marker id="arr" markerWidth="6" markerHeight="6" refX="3" refY="3" orient="auto"><path d="M0 0 L6 3 L0 6 z" fill="#8fb7d6"/></marker></defs><rect x="0" y="0" width="176" height="250" rx="8" fill="#152a45" stroke="#334354"/><text x="12" y="22" font-size="12" fill="#dcbd63" text-anchor="start" font-weight="700" font-family="inherit">01</text><text x="34" y="22" font-size="12" fill="#b1bfcc" text-anchor="start" font-weight="600" >Boot</text><text x="24" y="46" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >cores</text><rect x="24" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="40" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="56" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="72" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="88" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="104" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="120" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="136" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="24" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="40" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="56" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="72" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="88" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="104" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="120" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="136" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="24" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="40" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="56" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="72" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="88" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="104" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="120" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="136" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><text x="24" y="116" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >memory</text><rect x="24" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="40" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="56" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="72" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="88" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="104" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="120" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="136" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><text x="24" y="160" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >devices</text><rect x="24" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="43" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NIC</text><rect x="68" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="87" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NVMe</text><rect x="112" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="131" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >GPU</text><text x="88.0" y="206" font-size="10" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >Kernel A owns</text><text x="88.0" y="220" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >everything</text><path d="M179 119.0 l8 6 l-8 6" fill="none" stroke="#8697a8" stroke-width="1.5"/><rect x="190" y="0" width="176" height="250" rx="8" fill="#152a45" stroke="#334354"/><text x="202" y="22" font-size="12" fill="#dcbd63" text-anchor="start" font-weight="700" font-family="inherit">02</text><text x="224" y="22" font-size="12" fill="#b1bfcc" text-anchor="start" font-weight="600" >Carve out</text><text x="214" y="46" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >cores</text><rect x="214" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="230" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="246" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="262" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="278" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="294" y="52" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="310" y="52" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="326" y="52" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="214" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="230" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="246" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="262" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="278" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="294" y="68" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="310" y="68" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="326" y="68" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="214" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="230" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="246" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="262" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="278" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="294" y="84" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="310" y="84" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="326" y="84" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><text x="214" y="116" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >memory</text><rect x="214" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="230" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="246" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="262" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="278" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="294" y="122" width="13" height="12" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="310" y="122" width="13" height="12" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><rect x="326" y="122" width="13" height="12" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><text x="214" y="160" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >devices</text><rect x="214" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="233" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NIC</text><rect x="258" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="277" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NVMe</text><rect x="302" y="166" width="38" height="16" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><text x="321" y="178" font-size="8" fill="#8697a8" text-anchor="middle" font-weight="600" >GPU</text><text x="278.0" y="206" font-size="10" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >Cores, memory, GPU</text><text x="278.0" y="220" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >taken offline;</text><text x="278.0" y="234" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >device tree written</text><path d="M369 119.0 l8 6 l-8 6" fill="none" stroke="#8697a8" stroke-width="1.5"/><rect x="380" y="0" width="176" height="250" rx="8" fill="#152a45" stroke="#334354"/><text x="392" y="22" font-size="12" fill="#dcbd63" text-anchor="start" font-weight="700" font-family="inherit">03</text><text x="414" y="22" font-size="12" fill="#b1bfcc" text-anchor="start" font-weight="600" >Spawn</text><text x="404" y="46" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >cores</text><rect x="404" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="420" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="436" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="452" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="468" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="484" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="500" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="516" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="404" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="420" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="436" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="452" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="468" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="484" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="500" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="516" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="404" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="420" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="436" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="452" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="468" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="484" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="500" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="516" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><path d="M504 38 l0 6" stroke="#8fb7d6" stroke-width="1.5" marker-end="url(#arr)"/><text x="497" y="44" font-size="9" fill="#8fb7d6" text-anchor="end" font-weight="normal" >kexec</text><text x="404" y="116" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >memory</text><rect x="404" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="420" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="436" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="452" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="468" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="484" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="500" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="516" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><text x="404" y="160" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >devices</text><rect x="404" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="423" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NIC</text><rect x="448" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="467" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NVMe</text><rect x="492" y="166" width="38" height="16" rx="2" fill="#4d88b4" /><text x="511" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >GPU</text><text x="468.0" y="206" font-size="10" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >kexec boots Kernel B</text><text x="468.0" y="220" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >on exactly that</text><text x="468.0" y="234" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >hardware</text><path d="M559 119.0 l8 6 l-8 6" fill="none" stroke="#8697a8" stroke-width="1.5"/><rect x="570" y="0" width="176" height="250" rx="8" fill="#152a45" stroke="#334354"/><text x="582" y="22" font-size="12" fill="#dcbd63" text-anchor="start" font-weight="700" font-family="inherit">04</text><text x="604" y="22" font-size="12" fill="#b1bfcc" text-anchor="start" font-weight="600" >Share</text><text x="594" y="46" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >cores</text><rect x="594" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="610" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="626" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="642" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="658" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="674" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="690" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="706" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="594" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="610" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="626" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="642" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="658" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="674" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="690" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="706" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="594" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="610" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="626" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="642" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="658" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="674" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="690" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="706" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><text x="594" y="116" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >memory</text><rect x="594" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="610" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="626" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="642" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="658" y="122" width="13" height="12" rx="2" fill="url(#shared)" /><rect x="674" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="690" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="706" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><text x="664" y="146" font-size="8" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >DAXFS</text><text x="594" y="160" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >devices</text><rect x="594" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="613" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NIC</text><rect x="638" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="657" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NVMe</text><rect x="682" y="166" width="38" height="16" rx="2" fill="#4d88b4" /><text x="701" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >GPU</text><text x="658.0" y="206" font-size="10" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >Both map one</text><text x="658.0" y="220" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >DAXFS region</text><path d="M749 119.0 l8 6 l-8 6" fill="none" stroke="#8697a8" stroke-width="1.5"/><rect x="760" y="0" width="176" height="250" rx="8" fill="#152a45" stroke="#334354"/><text x="772" y="22" font-size="12" fill="#dcbd63" text-anchor="start" font-weight="700" font-family="inherit">05</text><text x="794" y="22" font-size="12" fill="#b1bfcc" text-anchor="start" font-weight="600" >Rebalance</text><text x="784" y="46" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >cores</text><rect x="784" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="800" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="816" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="832" y="52" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="848" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="864" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="880" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="896" y="52" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="784" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="800" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="816" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="832" y="68" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="848" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="864" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="880" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="896" y="68" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="784" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="800" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="816" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="832" y="84" width="13" height="13" rx="2" fill="#c9a13e" /><rect x="848" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="864" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="880" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><rect x="896" y="84" width="13" height="13" rx="2" fill="#4d88b4" /><path d="M840 44 l16 0" stroke="#8fb7d6" stroke-width="1.5" marker-end="url(#arr)"/><text x="784" y="116" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >memory</text><rect x="784" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="800" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="816" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="832" y="122" width="13" height="12" rx="2" fill="#c9a13e" /><rect x="848" y="122" width="13" height="12" rx="2" fill="url(#shared)" /><rect x="864" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="880" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><rect x="896" y="122" width="13" height="12" rx="2" fill="#4d88b4" /><text x="854" y="146" font-size="8" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >DAXFS</text><text x="784" y="160" font-size="9" fill="#8697a8" text-anchor="start" font-weight="normal" >devices</text><rect x="784" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="803" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NIC</text><rect x="828" y="166" width="38" height="16" rx="2" fill="#c9a13e" /><text x="847" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >NVMe</text><rect x="872" y="166" width="38" height="16" rx="2" fill="#4d88b4" /><text x="891" y="178" font-size="8" fill="#0e1e33" text-anchor="middle" font-weight="600" >GPU</text><text x="848.0" y="206" font-size="10" fill="#b1bfcc" text-anchor="middle" font-weight="normal" >A core moves</text><text x="848.0" y="220" font-size="10" fill="#8697a8" text-anchor="middle" font-weight="normal" >via hotplug</text><rect x="0" y="262" width="13" height="13" rx="2" fill="#c9a13e" /><text x="19" y="272" font-size="10" fill="#b1bfcc" text-anchor="start" font-weight="normal" >Kernel A</text><rect x="106" y="262" width="13" height="13" rx="2" fill="#4d88b4" /><text x="125" y="272" font-size="10" fill="#b1bfcc" text-anchor="start" font-weight="normal" >Kernel B</text><rect x="212" y="262" width="13" height="13" rx="2" fill="none" stroke="#4d5f73" stroke-dasharray="2 2"/><text x="231" y="272" font-size="10" fill="#b1bfcc" text-anchor="start" font-weight="normal" >Set aside</text><rect x="325" y="262" width="13" height="13" rx="2" fill="url(#shared)" /><text x="344" y="272" font-size="10" fill="#b1bfcc" text-anchor="start" font-weight="normal" >Shared memory</text></svg>
</div>
<div class="steps-grid">
<div class="step-card">
<div class="step-num">01</div>
<h3 class="step-title">Boot Linux as Usual</h3>
<p class="step-description">The machine boots a standard Linux kernel with the Multikernel patches. Nothing changes for your firmware, bootloader, or drivers. This first kernel starts out owning the whole machine.</p>
</div>
<div class="step-card">
<div class="step-num">02</div>
<h3 class="step-title">Carve Out Resources</h3>
<p class="step-description">You decide how the machine is divided. A set of cores, a block of memory, and optionally some devices are taken offline from the running kernel using standard CPU, memory, and device hotplug, and set aside for a new kernel. The running kernel then writes a device tree describing exactly that hardware, and nothing else.</p>
</div>
<div class="step-card">
<div class="step-num">03</div>
<h3 class="step-title">Spawn a New Kernel</h3>
<p class="step-description">Linux's kexec mechanism, extended to boot alongside the running kernel rather than replace it, starts a fresh kernel with that device tree. The new kernel discovers only the cores, memory, and devices it was handed, so it cannot touch anyone else's. It comes up in tens of milliseconds and can boot straight into a container image.</p>
</div>
<div class="step-card">
<div class="step-num">04</div>
<h3 class="step-title">Talk Through Shared Memory</h3>
<p class="step-description">Kernels never call into each other. When they need to cooperate, they exchange data through a region of memory mapped by both sides, so nothing is copied and no kernel waits on another one's locks.</p>
</div>
<div class="step-card">
<div class="step-num">05</div>
<h3 class="step-title">Run, Rebalance, Retire</h3>
<p class="step-description">Each kernel runs its workload unmodified with native performance. Moving a core, a memory block, or a device between kernels is a hotplug remove on one side and a hotplug add on the other, with no reboot. When a kernel is no longer needed it is torn down and its resources return to the pool.</p>
</div>
</div>
</div>
</section>
<section id="pieces" class="value-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">The Three Pieces</h2>
<p class="section-subtitle">Everything above comes down to three mechanisms.</p>
</div>
<div class="technologies-grid">
<div class="technology-card primary">
<div class="tech-icon">
<i data-lucide="grid-2x2"></i>
</div>
<h3 class="tech-title">Resource Partitioning</h3>
<p class="tech-description">Cores, memory, and devices are assigned to exactly one kernel at a time. Each kernel's share is spelled out in a device tree at boot, and changed afterwards through the same hotplug interfaces Linux already uses, so the machine is divided by policy, not by accident.</p>
</div>
<div class="technology-card primary">
<div class="tech-icon">
<i data-lucide="box"></i>
</div>
<h3 class="tech-title">Kernel Spawning</h3>
<p class="tech-description">Any running kernel can launch another one on resources it has set aside, using kexec. Each new kernel is a full, independent Linux instance with its own failure and update domain.</p>
</div>
<div class="technology-card primary">
<div class="tech-icon">
<i data-lucide="share-2"></i>
</div>
<h3 class="tech-title">Shared Memory / DAXFS</h3>
<p class="tech-description">The only thing kernels share on purpose. A region of memory exposed as a filesystem, used for message queues, container root filesystems, and data that kernels want to exchange without copying.</p>
</div>
</div>
</div>
</section>
<section id="split-kernel" class="how-it-works">
<div class="section-container">
<div class="value-content">
<div class="value-text">
<div class="section-badge">
<i data-lucide="git-branch"></i>
<span>A Special Case</span>
</div>
<h2 class="section-title">The Split-Kernel Configuration</h2>
<p class="section-subtitle">Multikernel itself does not care what each kernel does. In practice, one arrangement stands out because it turns kernel isolation into a performance advantage: give all the physical devices to a single kernel, the <strong>device-kernel</strong>, and give none to the others, the <strong>app-kernels</strong>. This is the configuration our products are built on.</p>
<p class="section-subtitle">The device-kernel runs every driver and takes every interrupt. Each app-kernel sees a virtual NIC and virtual disk whose queues live in shared memory, so packets and blocks stay in place and only descriptors cross the boundary. Applications get cores that no device ever interrupts, and the driver stack can be updated or restarted without touching them.</p>
<p class="section-subtitle">This is what the <a href="/technology.html">Technology</a> page describes in depth. It is one way to use Multikernel, not the only one: kernels can also own devices directly, or mix both styles on the same machine.</p>
</div>
<div class="value-visual">
<div class="partition-figure" style="margin: 0; max-width: 460px;">
<div class="partition-title">Split-Kernel Layout</div>
<div class="partition-domains">
<div class="partition-domain">
<div class="partition-cores">
{% for i in (1..8) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">Device-kernel</div>
<div class="partition-detail">All drivers</div>
</div>
<div class="partition-domain domain-app">
<div class="partition-cores">
{% for i in (1..12) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">App-kernel</div>
<div class="partition-detail">Virtual devices</div>
</div>
<div class="partition-domain domain-app shade-2">
<div class="partition-cores">
{% for i in (1..12) %}<span class="partition-core"></span>{% endfor %}
</div>
<div class="partition-name">App-kernel</div>
<div class="partition-detail">Virtual devices</div>
</div>
</div>
<p class="partition-caption">One kernel owns the hardware, the rest are interrupt-free.</p>
</div>
</div>
</div>
</div>
</section>
<section id="why" class="value-section">
<div class="section-container">
<div class="section-header">
<h2 class="section-title">Why This Design</h2>
<p class="section-subtitle">What separate kernels buy you that containers and virtual machines do not.</p>
</div>
<div class="features-grid">
<div class="feature-card">
<div class="feature-icon">
<i data-lucide="shield-check"></i>
</div>
<h3 class="feature-title">Isolation Without a Hypervisor</h3>
<p class="feature-description">Each workload has its own kernel, so a kernel bug or exploit in one cannot reach another. There is no hypervisor layer to pay for, and it works on bare metal or inside VMs you already run.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i data-lucide="gauge"></i>
</div>
<h3 class="feature-title">Native Performance</h3>
<p class="feature-description">Applications run directly on the CPU and memory assigned to them. No trapping, no nested page tables, and no lock contention with kernels running someone else's workload.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i data-lucide="refresh-cw"></i>
</div>
<h3 class="feature-title">Independent Lifecycles</h3>
<p class="feature-description">Kernels come and go independently. Upgrade or restart one kernel while the others keep running, without rebooting the machine.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i data-lucide="sliders"></i>
</div>
<h3 class="feature-title">A Kernel Tailored to Each Application</h3>
<p class="feature-description">Every kernel can be a different build with its own version, config, and tuning. A database gets huge pages and a deadline scheduler, a network service gets a lean stack with busy polling, without either compromise leaking into the other.</p>
</div>
<div class="feature-card">
<div class="feature-icon">
<i data-lucide="check-circle"></i>
</div>
<h3 class="feature-title">Still Just Linux</h3>
<p class="feature-description">Applications, container images, and tooling run unmodified. There is no new operating system to learn and no compatibility gap to work around.</p>
</div>
</div>
</div>
</section>
</main>