17. #DevoxxFR 17
CPU
LD: Charger un nombre depuis la RAM dans le CPU
MOV: Stocker un nombre venant du CPU dans la RAM
ADD: Faire l’addition de 2 nombres
CMP: Comparer les 2 opérandes
JMP: Sauter à une autre adresse
OUT: Ecrire sur un port d'entrée/sortie
IN: Lire depuis un port d'entrée/sortie
…et des centaines d’autres
INSTRUCTION SET (Specifique a chaque architecture):
35. Fetch-Decode-Execute
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
DX: 0xf38
AX: ‘4’
Serial port
execute(out %al, (%dx))
CPU
Execute
36. Fetch-Decode-Execute
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
DX: 0xf38
AX: ‘4’
Serial port
execute(out %al, (%dx))
WRITE
CPU
Execute
37. Fetch-Decode-Execute
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
DX: 0xf38
AX: ‘4’
Serial port
execute(out %al, (%dx))
WRITE
Privileged I/O Instruction
CPU
Execute
38. Virtualisation Hardware?
Mode spécifique du processeur (VMX)
Exécution restreinte et supervisée de certaines parties du code (Les VMs)
Pour chaque VM:
● Certaines instructions ne sont pas exécutées par le processeur (Trap)
● Délégation à un superviseur logiciel (a.k.a. hyperviseur)
● Trapper une instruction est un cas d’exception
● Exemple: CPUID
CPU
Fetch Decode Trap Emulate
41. Running a VM
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
CPU
42. Running a VM
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
CPU
43. Running a VM
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VMXON
CPU
VMXON
44. Running a VM
mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VMLAUNCH
CPU
VMLAUNCH
45. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VMLAUNCH
Running a VM
CPU
VMLAUNCH
46. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VMLAUNCH
VM
Running a VM
CPU
VMLAUNCH
47. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
Running a VM
CPU
48. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
FETCH
Running a VM
CPU
Fetch
49. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
decode(mov $0x3f8, %dx)
Running a VM
CPU
Decode
50. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
decode(mov $0x3f8, %dx)
-> Copier 0x3f8 dans le registre DX
Running a VM
CPU
Decode
51. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
execute(Copier 0x3f8 dans le registre DX)
Running a VM
CPU
Execute
52. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
Running a VM
CPU
53. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
Running a VM
CPU
54. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
Running a VM
CPU
55. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
Running a VM
CPU
56. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
FETCH
Running a VM
CPU
Fetch
57. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx))
Running a VM
CPU
Decode
58. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
Running a VM
CPU
Decode
59. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
TRAP
Running a VM
CPU
Trap
60. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
VM-EXIT
information
Running a VM
CPU
Trap
61. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
emulate(out %al, (%dx))
Running a VM
CPU
Emulate
62. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
e.g. write %al to log file
Running a VM
CPU
63. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
decode(out %al, (%dx)) ⚠
VMRESUME
CPU
VMRESUME
64. mov $0x3f8, %dx
add %bl, %al
add $'0', %al
out %al, (%dx)
mov $'n', %al
out %al, (%dx)
hlt
Memory
(e.g. RAM)
Hypervisor
VM
DX: 0xf38
AX: ‘4’
FETCH
Running a VM
CPU
Fetch
66. Mémoire Virtuelle
Abstraction de la mémoire physique
Illusion d’un espace d'adressage continu et très large
Un pointeur applicatif est un adresse virtuelle != physique
CPU Memory Management Unit (MMU) utilisé par le kernel
CPU
70. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
decode(mov dx, [0x12345678])
-> Copie la valeur à l’adresse 0x12345678 dans le registre dx
Decode
CPU
71. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
decode(mov dx, [0x12345678])
-> Copie la valeur à l’adresse 0x12345678 dans le registre dx
Decode
CPU
72. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
decode(mov dx, [0x12345678])
-> Copie la valeur à l’adresse 0x12345678 dans le registre dx
Adresse Virtuelle
Decode
CPU
73. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
decode(mov dx, [0x12345678])
-> Copie la valeur à l’adresse 0x12345678 dans le registre dx
Adresse Virtuelle
Adresse Physique??
Decode
CPU
75. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
translate(0x12345678)
Memory
Management
Unit
CPU
76. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
translate(0x12345678)
Memory
Management
Unit
CPU
77. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
translate(0x12345678)
Memory
Management
Unit
0x12345678 is at 0xff005678
CPU
78. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
translate(0x12345678)
Memory
Management
Unit
0x12345678 is at 0xff005678
Adresse Physique
CPU
79. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
execute(mov dx, [0x12345678])
0xf00ba4f00 @0xff005678
Memory
Management
Unit
Execute
CPU
80. Virtual Memory
mov dx, [0x12345678]
Memory
(e.g. RAM)
execute(mov dx, [0x12345678])
0xf00ba4f00 @0xff005678
Read @0xff005678
Memory
Management
Unit
CPU
127. Mémoire & Devices
Memory
(e.g. RAM)
MMU
I/O
I/O
MMU
south bridge, on parle de Platform
Controller Hub (PCH), qui est
directement lie au core du
processeur. Mais la plupart des
gens qui ont ce genre de
connaissances sont surement
encore sur le terme de south
bridge...
Samuel Ortiz
10:20 AM Yesterday
Une derniere information:
Aujourd'hui toutes les distros
bootent le kernel avec l'IOMMU=on
pare defaut. Ce qui signifie que
tous les devices sont toujours
derriere l'IOMMU, qu'ils soit
assignes a une VM ou pas.
154. CPU RAM NET. STOR.
Containers
HOST LINUX KERNEL
155. CPU RAM NET. STOR.
Containers
HOST LINUX KERNEL
Container A
Process A
Filters:
- Seccomp
- MAC
- CAPs
namespaces
156. CPU RAM NET. STOR.
Containers
HOST LINUX KERNEL
Container A
Process A
Filters:
- Seccomp
- MAC
- CAPs
Container B
Process B
Filters:
- Seccomp
- MAC
- CAPs
namespaces namespaces
157. Containers
CPU RAM NET. STOR.
HOST LINUX KERNEL
Container A Container B Container C
Process A Process B Process C
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
namespaces namespaces namespaces
158. Containers
CPU RAM NET. STOR.
HOST LINUX KERNEL
Container A Container B Container C
Process A Process B Process C
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
namespaces namespaces namespaces
Kernel
Partagé
159. Containers
CPU RAM NET. STOR.
HOST LINUX KERNEL
Container A Container B Container C
Process A Process B Process C
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
namespaces namespaces namespaces
Kernel
Partagé
Contexte
d’exécution
Partagé
160. Containers
CPU RAM NET. STOR.
HOST LINUX KERNEL
Container A Container B Container C
Process A Process B Process C
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
Filters:
- Seccomp
- MAC
- CAPs
namespaces namespaces namespaces
Kernel
Partagé
Contexte
d’exécution
Partagé
Rapidité de
démarrage /
cycle de vie
facilité
163. VMs
VM A VM B
Processus A Processus B
CPU RAM NET. STOR. CPU RAM NET. STOR.
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
HOST LINUX KERNEL
(HYPERVISOR)
164. VMs
VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
HOST LINUX KERNEL
(HYPERVISOR)
165. VMs
VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
166. VMs
VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
167. VMs
VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
Cycle de
vie lourd
/LENTEUR de
démarrage
HOST LINUX KERNEL
(HYPERVISOR)
168. VMs
VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
Cycle de
vie lourd
/LENTEUR de
démarrage
?
HOST LINUX KERNEL
(HYPERVISOR)
171. VM A VM B VM C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
Containers in VMs
Cycle de
vie lourd
/LENTEUR de
démarrage
?
172. VM Légère A VM Légère B VM Légère C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
Containers in VMs
173. VM Légère A VM Légère B VM Légère C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
Containers in VMs
Container A Container B Container C
174. VM Légère A VM Légère B VM Légère C
Processus A Processus B Processus C
CPU RAM NET. STOR. CPU RAM NET. STOR. CPU RAM NET. STOR.
Virtualisation du
HARDWARE
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
GUEST
LINUX KERNEL
Kernels
dédiés
HOST LINUX KERNEL
(HYPERVISOR)
Rapidité de
démarrage /
cycle de vie
facilité
Containers in VMs
Container A Container B Container C
175. Containers in VMs
VMs Légères (e.g. Firecracker)
Intégration avec CRI (Containerd, Kubernetes…)
RuntimeClass pour (par exemple) n’exécuter que
des payloads non trustées dans des conteneurs.
179. Containers in VMs Kubernetes
Kubernetes
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
POD
CONTAINER
POD
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
KERNEL
KubE. C. P. KubE. C. P.
Kubernetes control plane
180. Containers in VMs Kubernetes
Kubernetes
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
POD
CONTAINER
POD
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
KERNEL
Isolation through multiple KUBE NODES
Kubernetes control plane KubE. C. P. KubE. C. P.
181. Containers in VMs Kubernetes
Kubernetes
KERNEL
Kubernetes
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
POD
CONTAINER
POD
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
KERNEL
POD
CONTAINER
CONTAINER
KERNEL KERNEL
POD POD POD POD POD
KATA
VM
KATA
VM
KATA
VM
KATA
VM
KATA
VM
CONTAINER
CONTAINER
CONTAINER
CONTAINER CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
Isolation through multiple KUBE NODES
Kubernetes control plane KubE. C. P. KubE. C. P. Kubernetes control plane
182. Containers in VMs Kubernetes
Kubernetes
KERNEL
Kubernetes
KERNEL
POD
CONTAINER
CONTAINER
CONTAINER
POD
CONTAINER
POD
CONTAINER
CONTAINER
Kubernetes control plane
POD
CONTAINER
CONTAINER
CONTAINER
KubE. C. P.
POD
CONTAINER
CONTAINER
KubE. C. P. Kubernetes control plane
POD POD POD POD POD
KATA
VM
KATA
VM
KATA
VM
KATA
VM
KATA
VM
CONTAINER
CONTAINER
CONTAINER
CONTAINER CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
CONTAINER
Multi-tenancy
Isolation through multiple KUBE NODES