Betriebssystembau (BSB) Das Programmiermodell der x86_64-architektur https://ess.cs.tu-dortmund.de/de/teaching/ws217/bsb/ Daniel Friesel, Olaf Spinczyk daniel.friesel@tu-dortmund.de https://ess.cs.tu-dortmund.de/~df AG Eingebettete Systemsoftware Informatik 12, TU Dortmund
Überblick: Vorlesungen Struktur des OO-StuBS -Betriebssystems: Anwendung(en) Gerätezugriff (Treiber) Kontrollflussabstraktion Unterbrechungssynchronisation Hardware Prozessverwaltung Unterbrechungsbehandlung Interprozesskommunikation Betriebssystementwicklung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 2
Überblick: Vorlesungen Struktur des OO-StuBS -Betriebssystems: Anwendung(en) Gerätezugriff (Treiber) Hardware Prozessverwaltung Interprozesskommunikation Unterbrechungsbehandlung Unterbrechungssynchronisation Kontrollflussabstraktion Betriebssystementwicklung Thema der heutigen Vorlesung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 3
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 4
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 5
Historie der Intel x86-prozessoren (1) 886 (1978) der Urvater des PC-Prozessors 8286 (1982) Einführung des Protected Mode segmentbasierter Speicherschutz 8386 (1985) erster IA-32-Prozessor seitenbasierter virtueller Speicher 8486 (1989) integrierte FPU, RISC-Ansätze Pentium (1993) superskalar, 64-Bit-Datenbus SMM, MMX, APIC, Dualprozessor-fähig Pentium Pro (1995) Server, High-End Pentium II (1997) Pentium Pro + MMX RISC-artige Mikroinstruktionen Pentium III (1999) SSE Pentium 4 (2) Netburst-Architektur SSE2, Hyperthreading, Vanderpool, Intel 64/EM64T 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 6
Historie der Intel x86-prozessoren (2) Core (25) Dual Core, weniger Strom Pentium III-Derivat, SSE3, Core 2 (26) Dual/Quad Core, 64 Bit (amd64) Core i3/i5/i7 (28) SSE4, QPI, SMT, L3-Cache On-die L3-Cache, integrierter Speichercontroller und teils GPU Atom (28) noch weniger Strom Sandy Bridge (211) AVX, AES-NI Haswell/Broadwell (213) AVX2, TSX Sky-/Kaby-/Cannonlake (215-17) AVX3, MPX, SGX, ADX integrierte Southbridge, USB 3.1, GPU für 3D und 4k-Video 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 7
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 8
886: Programmiermodell 16-Bit-Architektur, little-endian 2-Bit-Adressbus, d.h. maximal 1 MiB Hauptspeicher wenige Register (jedenfalls aus heutiger Sicht) 123 Befehle kein orthogonaler Befehlssatz Befehlslängen von 1 bis 4 Byte segmentierter Speicher noch immer aktuell obwohl von 1978: noch heute von jeder amd64-cpu unterstützt Real Mode, Virtual 886 Mode Aufwärtskompatibilität wird bei Intel großgeschrieben 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 9
886: Registersatz Befehls- und Stapelzeiger 15 IP SP Flags-Register 15 FLAGS Vielzweckregister 15 AH BH CH DH AL BL CL DL Segmentregister 15 CS SS DS ES Stack Data Extra SI DI BP 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 1
886: Registersatz Befehls- und Stapelzeiger 15 IP SP Vielzweckregister 15 AH BH CH DH SI DI BP AL BL CL DL Jedes Vielzweckregister erfüllt seinen speziellen Zweck AX: Accumulator Register arithmetisch-logische Operationen I/O Flags-Register kürzester 15 Maschinencode FLAGS BX: Base Address Register CX: Count Register für LOOP-Befehl Segmentregister für 15 String-Operationen mit REP für Bit Shift und Rotate CS DX: Data SS Register Stack DX:AX DSsind 32 Bit für MUL/DIVData Portnummer ES für IN und OUT Extra SI, DI: Index Register für Array-Zugriffe (Displacement) BP: Base Pointer 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 11
886: Segmentierter Speicher logische Adressen bestehen beim 886 aus Segmentselektor (i.d.r. der Inhalt eines Segmentregisters) Offset (i.d.r. aus einem Vielzweckregister oder dem Befehl) Berechnung der physikalischen Adresse: 15 Segmentselektor 15 + Offset 19 physikalische Adresse Die 16-Bit-Konkurrenz konnte i.d.r. nur 64KB adressieren. 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 12
886: Segmentierter Speicher logische Adressen bestehen beim 886 aus Segmentselektor (i.d.r. der Inhalt eines Segmentregisters) Offset (i.d.r. aus einem Vielzweckregister oder dem Befehl) Berechnung der physikalischen Adresse: 64K ought to be enough for anybody 15 Segmentselektor 15 + Offset angeblich ein Zitat von Bill Gates, 1981 19 physikalische Adresse Die 16-Bit-Konkurrenz konnte i.d.r. nur 64KB adressieren. 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 13
886: Speichermodelle Programme können Adressen unterschiedlich bilden. Das Ergebnis waren unterschiedliche Speichermodelle: Tiny -, Daten- und Stacksegment sind identisch: 64K insgesamt Small Trennung des s von Daten und Stack: 64K + 64K Medium 32- (bzw. 2-) Bit-Zeiger für, Daten- & Stapelseg., aber fest (64K) Compact Festes -Segment (64K), 32- (2-) Bit-Zeiger für Daten & Stack Large far -Zeiger für alles: 1MB komplett nutzbar Huge wie Large, aber mit normalisierten Zeigern 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 14
886: Fazit Urvater der PC-Prozessoren bildete den Kern der ersten PCs noch heute sind x86- und amd64-prozessoren kompatibel Segmentregister brachten Vorteile trotz 16-Bit-Architektur 1 MB Speicher Trennung von logischen Modulen im Hauptspeicher Programm- und Übersetzerentwicklung ist aber vergleichsweise schwierig verschiedene Speichermodelle nicht-orthogonaler Befehlssatz 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 15
IA-32 die 32-Bit-Intel-Architektur die erste IA-32-CPU war der 8386 wobei der Begriff IA-32 erst sehr viel später eingeführt wurde 32-Bit-Technologie: Register, Daten- und Adressbus ab Pentium Pro: 64 Bit Daten- und 36 Bit Adressbus zusätzliche Register komplexe Schutz- und Multitasking-Unterstützung Protected Mode ursprünglich schon mit dem 8286 (16-Bit) eingeführt Kompatibilität mit älteren Betriebssystemen durch den Real Mode mit älteren Anwendungen durch den Virtual 886 Mode segmentbasiertes Programmiermodell seitenbasierte MMU 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 16
amd64 Die 64-Bit-AMD-Architektur IA-32 erlaubte nur maximal 4 GB virtuellen Speicher Lösung: 64-Bit-Architektur Derzeit 48 Bit virtueller Adressraum (bis zu 256 TB) Weitere (und 64 Bit breite) Register Seitenbasierters Programmiermodell mit Speicherschutz No Execute-Bit für einzelne Seiten (Fast) keine Segmentierung Weiterhin rückwärtskompatibel Long Mode zur Nutzung der neuen Eigenschaften 32-Bit Legacy Mode für Systeme oder einzelne Anwendungen Von AMD entwickelt und von Intel (als Intel 64) übernommen Inzwischen meist als x86_64 / x64 bezeichnet Intels IA-64 (Itanium) konnte sich nicht durchsetzen 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 17
x86_64: Registersatz (Erweiterungen) erweiterte Register heißen aus Kompatibilitätsgründen R RAX RBX RCX RDX RSI RDI RBP R8 R15 Vielzweckregister 63 16 15 AX BX CX DX SI DI BP RIP RSP RFLAGS Stack Data Extra Befehls- und Stapelzeiger 63 Flags-Register Segmentregister 15 CS SS DS ES 16 15 63 16 15 Extra Extra 15 IP SP FLAGS FS GS Erweiterung zum 886 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 18
x86_64: Registersatz (neue Register) Speicherverwaltungsregister 15 63 31 TR TSS-Sel. TSS-Basisadresse LDTR LDT-Sel. LDT-Basisadresse IDTR IDT-Basisadresse GDTR GDT-Basisadresse Steuerregister 63 32 31 CR8 CR4 CR3 CR2 CR Modellspezifische Register TSS-Limit LDT-Limit IDT-Limit GDT-Limit 15 DR DR1 DR2 DR3 DR6 DR7 Debugregister 63 32 31 Erläuterungen folgen 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 19
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 2
x86_64: Adressierungsarten Effektive Adressen (EA) werden nach einem einfachen Schema gebildet alle Vielzweckregister können dabei gleichwertig verwendet werden EA = Basis-Reg. + (Index-Reg. * Scale) + Displacement Beispiel: MOV RAX, Feld[RSI * 4] 1/2/4/8 --- 1/2/4 Byte EA Lesen aus Feld mit 4 Byte großen Elementen und RSI als Index Neu bei x86_64: Relative Adressierung EA = RIP + Displacement 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 21
Das A2-Gate ist ein Relikt aus der Zeit der 8286-Systeme (IBM AT) beim IBM XT (886) konnte es bei der Adressberechnung zu einem Überlauf kommen. Im Maximalfall: xffef nur 2 Bit! xffff + xffff 1 1 1 1 x1ffef Segment * 16 Offset phys. Adresse MS-DOS (und andere Systeme) verwenden diesen Trick. Aus Kompatibilitätsgründen wurde im IBM AT die A2-Leitung über das A2 Gate (Register im Tastaturcontroller) maskiert. A2 muss explizit freigeschaltet werden, um Speicher > 1 MiB zu adressieren Ab dem 486 hat Intel das A2-Gate in die CPU integriert! 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 22
IA-32: Protected Mode Segmente Ein Programm (in Ausführung) besteht aus mehreren Speichersegmenten Traditionell mindestens CODE, DATEN und STACK Segmentselektoren beschreiben (indirekt) Adresse und Länge Lineare Adresse ist Segmentstartadresse + EA Lineare Adresse entspricht physikalischer Adresse, falls die Paging Unit nicht eingeschaltet ist. Segmente dürfen sich überlappen, z.b. Startadressen == In der Praxis wird i.a. ein solcher flacher Adressraum genutzt Kein segmentbasierter Schutz im Long Mode Nur FS/GS-Startadresse und CS-Attribute werden berücksichtigt 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 23
x86_64: Segmente Segment Register SS GS FS ES DS CS Selektor Tabelle Flags Limit Startadresse SS GS FS ES DS CS Segmentdeskriptoren effektive Adresse + + Segmentgrenze lineare Adresse Startadresse des Segments Basis-Register Index-Register Scale 1, 2, 4 oder 8 Displacement (im Befehl) Operand selektiertes Segment 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 24 x Limit linearer Adressraum
x86_64: Seitenbasierte MMU Ein- und Auslagerung von Speicher (zwecks virtuellem Speicher) auf Seitenbasis Ab dem 8386 kann eine Paging Unit (PU) optional hinzugeschaltet werden, in x86_64 obligatorisch Die wichtigsten Verwaltungsinformationen stehen in den Steuerregistern CR/2/3: CR3 CR2 CR 63 reserviert Basis-Adresse der Page Map Virtuelle Adresse des Page-Faults reserviert PG sonstige reserviert PE Paging: 1=aktiv Protected-Mode Enable: 1=aktiv 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 25
x86_64: Seitenübersetzungstabelle lineare Adresse 63 N/A 48 47 39 PML4-Index 38 3 29 21 2 12 11 PDP-Index PD-Index Page-Index Offset 51 CR3 PML4-Basis 12 Page-Map Level 4 Eintrag 511... Eintrag 2 Eintrag 1 Eintrag Page Directory Pointers Eintrag 511... Eintrag 2 Eintrag 1 Eintrag Page Directory Eintrag 511... Eintrag 2 Eintrag 1 Eintrag Page Table Eintrag 511... Eintrag 2 Eintrag 1 Eintrag Page Frames (phys. Adr.)... Page-Frame 4KiB (, Daten) Page-Frame 4KiB (, Daten) Page-Frame 4KiB (, Daten)...... Page-Frame (, 4KiB Daten) 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 26
x86_64: TLB Problem: Speicherzugriffe werden durch Indirektion über PML4, PDP, Page Directory und Page Table verlangsamt Lösung: der Translation Lookaside Buffer (TLB): assoziativer Cache Tag: PML4/PDP/PD/PT Daten: Page-Frame-Adresse Größe und Assoziativität hängen von CPU ab bei normalen Anwendungen erreicht der TLB eine Trefferrate von etwa 98% Schreiben in das CR3-Register invalidiert den TLB 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 27
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 28
Schutz unter IA-32 die wichtigste Eigenschaft des Protected Mode ist das Schutzkonzept Ziel: fehlerhaften oder nicht vertrauenswürdigen isolieren Schutz vor Systemabstürzen Schutz vor unberechtigten Datenzugriffen keine unberechtigten Operationen, z.b. I/O-Port-Zugriffe Voraussetzungen: und Daten werden hinsichtlich der Vertrauenswürdigkeit kategorisiert bekommen einen Besitzer (siehe "Multitasking") 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 29
Schutzringe und Gates Durch einen 2-Bit- Eintrag im Segmentdeskriptor wird jedes Segment einer Privileg-Ebene zugeordnet. Daten Daten Daten 3 2 1 Daten Daten Daten 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 3
Schutzringe und Gates Privileg-Ebene 3 ist die niedrigste und für Anwendungen gedacht. Anwendungen Daten Kundenspezifische BS-Erweiterungen Daten Systemdienste Daten Kern 3 2 1 Daten Privileg-Ebene ist die höchste und dem Betriebssystemkern vorbehalten. Daten Daten 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 31
Schutzringe und Gates Zugriff auf Daten Daten eines inneren Rings ist verboten Daten Daten eines inneren Rings kann nur durch Gates aufgerufen werden 3 2 1 Zugriff auf Daten eines Daten äußeren Rings Zugriffe erlaubt Daten Daten auf Segmente der Aufruf von derselben eines äußeren Rings Ebene sind ist i.a. verboten! erlaubt 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur erlaubt 32
Segmentdeskriptoren Erlauben Schutz von im Protected Mode jede Verletzung führt zum Auslösen einer Ausnahme In 64-Bit-Systemen erlauben sie die Ausführung von 32-Bit- ein Segment-Deskriptor Segment Base 31... 24 G D/B L AVL Limit 19... 16 +6 P S DPL Segment Base 15... Segment Limit 15... TYPE Segment Base 23... 16 +4 +2 TYPE : C - Conforming R - Readable A - Accessed P - Present Bit G - Granularity DPL - Descriptor Privilege Level D/B - 16/32 Bit Seg. S - System Segment L - Long Mode aktiv 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 33
Schutz unter x86_64 Segmentierung wurde in der Praxis kaum angenommen Fast alle IA-32-Systeme nutzen flaches Speichermodell Offset der logischen Adresse = lineare Adresse Stattdessen: Schutz durch virtuellen Speicher Phys. Speicher Prozess 1: Prozess 2: Prozess n: CR3 CR3 CR3 Seiten- Tabelle Seiten- Tabelle Seiten- Tabelle... Seite 2 Seite 2 Seite 2 Seite 1 Seite Jeder Prozess sieht nur seinen virtuellen Adressraum Seitentabelle ist vor Anwendungssoftware verborgen Zusätzliche Einschränkungen pro Seite möglich 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 34
Einträge der Seitenübersetzungstabelle 63 62 52 51 12 N X Available Basisadresse der Tabelle / Basisadresse der Seite 11 1 2 1 AVL... U/S R/W P No Execute User/Supervisor Read/Write Present Einstellung in jeder Hierarchieebene möglich Daten dürfen nicht als ausgeführt werden (NX=1) Schutz vor Lesezugriffen aus Ring 3 (U/S=) Readonly-Seiten (R/W=) Erlaubt Umsetzung von Shared Memory Oder Readonly-Zugriff auf Betriebssystemstrukturen Effektiv werden nur Ring (Kern) und 1-3 (Anwendung) getrennt 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 35
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 36
IA-32: Multitasking Neben dem Schutz vor unberechtigten vertikalen Zugriffen zwischen Segmenten unterschiedlicher Ebenen unterstützt IA-32 auch ein Task-Konzept ( horizontale Trennung ) Ist im x86_64 Long Mode nicht verfügbar Daten Globale Segmente (Deskriptoren in Daten Daten der GDT) Segmente aus 3 2 1 der LDT von Task A Daten Daten Task A Daten Task C Task B 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 37
Task State-Segmente Das Task-Register TR verweist auf das Task State Segment (TSS) In IA-32 nimmt es den Task- Zustand auf Segmente, Registerinhalt,... Task-Wechsel sind so komplett in Hardware möglich x86_64 unterstützt dies nicht Stattdessen: TSS für E/A- Berechtigungen und Stackpointer I/O Permission Bitmap I/O Map Base Address IST7 IST6 IST5 IST4 IST3 IST2 IST1 RSP2 RSP1 RSP 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 38
Ein-/Ausgaben im Long Mode Nicht jeder beliebige Task darf Ein-/Ausgaben durchführen! Zugriffe auf Geräte im Speicher (memory-mapped I/O) können über Speicherschutz abgefangen werden Zugriffe auf I/O-Ports werden eingeschränkt: die I/O Privilege Level-Bits im RFLAGS-Register erlauben Ein- und Ausgaben auf bestimmten Schutzringen auf den anderen Ebenen regelt die I/O Permission Bitmap im TSS den Zugriff: TSS Die Bitmap endet mit 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 eine '1' verhindert 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 dem TSS- 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 den Portzugriff 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Segmentende, Ports 1 1 1 1 1 1 1 1 1 1 1 1 mit größeren Port Nummern dürfen nicht angesprochen I/O Map Base Address werden. IST7 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 39...
x86_64: Was gibt es sonst noch? Bald: 5-Level Paging Bis zu 4 PB Speicher (128 PB Adressraum) statt bisher 64/256 TB System Management Mode (SMM) gibt dem BIOS Kontrolle über das System das Betriebssystem merkt davon nichts! Virtualisierung der CPU der Virtual 886 Mode 16-Bit-Anwendungen oder Betriebssysteme laufen als Task in einer geschützten Umgebung Intel-VT, AMD-V Hardwareunterstützung für virtuelle Maschinenlösungen wie VMware, VirtualPC oder Xen erlaubt die Ausführung von Ebene--Protected-Mode- in einer VM 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 4
Agenda Historie Basisprogrammiermodell Speicherverwaltung und Adressierung Schutz Tasks Zusammenfassung 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 41
Zusammenfassung die x86_64-architektur ist ausgesprochen komplex, u.a. Virtueller Speicher mit vierfacher Seitentabelle Seitenbasierter Speicherschutz Schutz von I/O-Ports pro Task Ausführung von im 32-Bit Legacy Mode in einem 64-Bit-System Kaum genutzte IA-32-Features wurden in amd64 entfernt Segmentierung (viele Systeme nutzen einen flachen Adressaum) Task-Wechsel in Hardware Dennoch: konsequente Kompatibilität mit älteren Prozessorversionen Stichwort Legacy / Virtual 886 Mode, PIC und A2 Gate! 16. Nov 217 Betriebssystembau: 6-Das Programmiermodell der x86_64-architektur 42