Intel x86 Bootstrapping

Ähnliche Dokumente
Wie schreibt man ein Betriebssystem?

Virtueller Speicher und Memory Management

DOSEMU. Vortrag im Hauptseminar Konzepte und Techniken virtueller Maschinen und Emulatoren. Matthias Felix FAU. 13.

Zwei Möglichkeiten die TLB zu aktualisieren

i386 Interrupt-Deskriptortabelle (IDT)

Übung zu Betriebssystembau (Ü BS)

Betriebssystembau. 3. Übung. Michael Engel Arbeitsgruppe Eingebettete Systemsoftware. Lehrstuhl für Informatik 12 TU Dortmund

Bootvorgang des DSM-Systems Systems Plurix

Echtzeitbetriebssysteme

Betriebssystemtechnik

Betriebssysteme (BS) IA-32. Überblick. das Programmiermodell der Intel Architektur. Historie der Intel x86 Prozessoren. 8086: Programmiermodell

5.6 Segmentierter virtueller Speicher

Aufgabe 2 - Erweiterung um PIC und Interrupts

RO-Tutorien 15 und 16

Konzepte von Betriebssystemkomponenten

Proseminar Konzepte von Betriebssystem- Komponenten (KVBK) Vortrag zum Thema: Speicheraddressierung, Segmentierung, Paging

Echtzeit-Multitasking

Paging. Einfaches Paging. Paging mit virtuellem Speicher

Echtzeit-Multitasking

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Betriebssysteme (BS)

Name: ES2 Klausur Thema: ARM Name: Punkte: Note:

Wie groß ist die Page Table?

Betriebssysteme BS-V SS Hans-Georg Eßer. Foliensatz V: Ulix: Interrupts und Faults Ulix: System Calls. Dipl.-Math., Dipl.-Inform.

Aufgabe 2 - Erweiterung um PIC und Interrupts

Tutorium Rechnerorganisation

Einführung in die technische Informatik

Betriebssysteme KU - Einführungstutorium

Pru fungsprotokoll. Prüfer: Dr. Lenhardt Beisitzer:? Datum der Prüfung: Dauer: 25 Minuten

Betriebssystembau (BSB)

Proseminar Konzepte von Betriebssystem-Komponenten (KVBK) Vortrag zum Thema: Speicheraddressierung, Segmentierung, Paging Von Christian Hubert

Prof. Dr. Sharam Gharaei. Inhaltsverzeichnis. 1 Einleitung 1. 2 Grundlage der Realisierung 2. 3 Die Realisierung 3. Literaturverzeichnis 7

Realisierung: virtueller Prozessor: der reale Prozessor wird periodisch dem Programm zugewiesen Im Prozessor: durch Task-Status Segment (TSS)


Betriebssysteme Teil 10 B: Fragen rund um Seitenfehler

Aufgabe 1 Entwicklung einer Virtuellen Maschine

Betriebssysteme SS Hans-Georg Eßer Dipl.-Math., Dipl.-Inform. SB 3 ( , v2) Speicherverwaltung Ein-/Ausgabegeräte und Schnittstellen

Schreiben von Pages. Schreiben einer Page in den Swap Space ist sehr teuer (kostet millionen von CPU Zyklen).

7. Speicherverwaltung

Kapitel 6 Speicherverwaltung Seite 1 zum Teil nach: Silberschatz&Galbin, Operating System Concepts, Addison-Wesley)

Lösungsvorschlag für Übung September 2009

HARDWARE UND GERÄTETREIBER. Björn Döbel (TU Dresden)

Betriebssysteme Sommersemester Betriebssysteme. 5. Kapitel. Adressumsetzung. Dr. Peter Tröger / Prof. M. Werner. Professur Betriebssysteme

Kompatibilitätsmodi: Real Mode: - Segmentregister*16+Offset => Adresse - Keine Segmentdeskriptoren, kein Paging, - ~ 1 MB Adressraum.

(Cache-Schreibstrategien)

x86 Open Source Virtualisierungstechniken Thomas Glanzmann

Speicherverwaltung III

Linux Paging, Caching und Swapping

Rechnerorganisation. Überblick über den Teil 13

Quiz. Gegeben sei ein 16KB Cache mit 32 Byte Blockgröße. Wie verteilen sich die Bits einer 32 Bit Adresse auf: Tag Index Byte Offset.

Virtueller Speicher. SS 2012 Grundlagen der Rechnerarchitektur Speicher 44

Mikroprozessortechnik Grundlagen 1

Lösung von Übungsblatt 2

Das Paging: Stellen wir uns eine Zahlenmenge vor mit 12 Zahlen und zwar von 0 bis 11.

Atmel AVR für Dummies

Systeme 1. Kapitel 9.2. Interaktion von Hardware und Betriebssystem Linux-Kernel und x86 Systeme

Linker: Adreßräume verknüpfen. Informationen über einen Prozeß. Prozeß-Erzeugung: Verwandtschaft

Einführung. Übungen zur Vorlesung Virtuelle Maschinen. Stefan Potyra. SoSe 2009

HARDWARE UND GERÄTETREIBER. Björn Döbel (TU Dresden)

Sichere Virtualisierung auf dem Fiasco-Mikrokern

Leichtgewichtsprozesse

Name : Klasse : Punkte : Note :

Betriebssysteme. Speicherverwaltung - Grundlegende Konzepte. Sommersemester 2014 Prof. Dr. Peter Mandl. Prof. Dr. Peter Mandl Seite 1.

Grundlagen der Rechnerarchitektur

virtueller Speicher - Trennung des logischen Speichers der Anwendung vom physikalischen Speicher.

Vortrag zur Seminarphase der PG Solar Doorplate MSP430 Wichtigste Grundlagen von David Tondorf

Speicherverwaltung (Swapping und Paging)

Cache Blöcke und Offsets

ARM Cortex-M Prozessoren. Referat von Peter Voser Embedded Development GmbH

Hans-Georg Eßer, Hochschule München, Betriebssysteme I, SS Speicherverwaltung 1

5.5.5 Der Speicherverwalter

Konzepte von Betriebssystemkomponenten Referat am Thema: Adressräume, Page Faults, Demand Paging, Copy on Write Referent: Johannes Werner

Computer-Systeme Teil 15: Virtueller Speicher

Universität Bielefeld Technische Fakultät AG Rechnernetze und verteilte Systeme. Vorlesung 4: Memory. Wintersemester 2001/2002. Peter B.

DYNAMISCHE VERWALTUNG VIRTUELLEN SPEICHERS FÜR ECHTZEITSYSTEME

E Mikrocontroller-Programmierung

Betriebssysteme I SS 2008 Hans-Georg Eßer, Hochschule München Zusammenfassung Seite 1

Ein- und Ausgabegeräte

15. Hauptspeicher-Adressierung

Besprechung des 9. Übungsblattes Virtuelle Speicherverwaltung Aufgaben

1. Speicher. Typische Nutzung eines Adreßraums. Systemsoftware. Textbereich relativ klein. Sehr großer Abstand zwischen Heap und Stack

Arithmetische und Logische Einheit (ALU)

Sonstiges Award Bios POST Codes ab 6.0

Vorlesung: Virtualisierung und Rechenzentrumsinfrastrukturen. Lars Göbel & Christian Müller VL04: Einführung in die Virtualisierung

Technische Informatik II Wintersemester 2002/03 Sommersemester Heiko Holtkamp

Ressourcenübersicht Rack PC 840, Box PC 840

01744 PC-Technologie Prüfungsprotokoll (Note 1,3) vom bei Dr. Lenhardt, Protokollführer Dr. Bähring

BIOS-Signale. Die unterschiedlichen BIOS-Hersteller verwenden unterschiedliche Signale. AMI AWARD IBM PHOENIX MR-BIOS

Grundlagen Rechnerarchitektur und Betriebssysteme

6.Vorlesung Grundlagen der Informatik

Vorlesung "Struktur von Mikrorechnern" (CBS)

Bibliotheks-basierte Virtualisierung

Betriebssysteme Teil 10: Virtueller Speicher

x86-assemblerprogrammierung

1,8V Flash and SRAM 28F3208W30

Betriebssysteme VO Betriebssysteme KU

Betriebssysteme 1. Thomas Kolarz. Folie 1

Betriebssysteme (BS) IA-32. Überblick: Vorlesungen. das Programmiermodell der Intel-Architektur. Agenda. Historie der Intel x86-prozessoren

Transkript:

Intel x86 Bootstrapping Meine CPU, mein Code! Andreas Galauner SigInt 2010

Democode Es gibt Democode: http://github.com/g33katwork/ SigInt10OSWorkshop git clone git://github.com/g33katwork/ SigInt10OSWorkshop.git Am besten direkt clonen und make eingeben, Toolchain (binutils, gcc, nasm, qemu) wird gebaut make V=1 macht verbose output, falls es Probleme gibt

Intel x86 Geschichte Mikroprozessor-Architektur Entworfen von Intel Erstmals im 8088/8086 im Jahre 1978 genutzt 8086 war 16 Bit Nachfolgemodelle: 80186, 80286, 80386 etc. 32 Bit ab 80386 Virtueller Speicher mit MMU ab 80486 AMD entwickelte x86_64 (EM64T bei Intel)

Bootvorgang Ab 80386 startet Prozessor bei 0xFFFFFFF0 (reset vector) BIOS liegt aber in unteren 64KB (ca.) Lösung: Nach reset wird BIOS vom Chipsatz meistens in die obersten paar MB gemappt Wenn BIOS läuft, wird Black-Initialisierungs-Voodoo ausgeführt (näheres dazu unter coreboot.org) Danach werden, je nach Bootdevice, 512 Byte nach 0x0:07C0 kopiert und hingesprungen CPU befindet sich hier im Real Mode (8086, 16 Bit)

Segmentierung 8086 hatte 20 Adressleitungen (A0 - A19) Physikalisch Adressierbar waren somit 1MB RAM Register sind aber alle nur 16 Bit breit, womit 4 Bit im Adressbus brach lägen Segmentierung löst das Problem

Segmentierung Speicher wird in 16-Byte große Segmente (16 Byte = 64KB adressierbar) aufgeteilt Segmente können sich überlappen In 16 Bit Registern (CS, DS, ES, SS) kann für verschiedene Zwecke ein Segmentanfang ausgewählt werden Physikalische Adresse resultiert aus: Segmentregister * 16 + Offset

Real Mode Ist der alte 16 Bit Modus eines 8086 Intel ist voll binär Abwärtskompatibel Bootloader starten hier BIOS bietet Systemfuntkionen über Interrupts an (Floppy steuern, Text ausgeben...)

Protected Mode Mit 80286 kam ein 24 Bit Adressbus (16MB) und der Protected Mode Alle Register blieben 16 Bit breit Der Protected Mode bietet Speicherschutz durch manuelles erstellen der Speichersegmente (GDT - Global Descriptor Table und LDT - Local Descriptor Table) Insgesamt gab es 1GB virtuellen Speicher

A20 Gate Es gab DOS-Programme, die sich darauf verließen, dass es nur 20 Bit breite physikalische Adressen gab Sie nutzten also explizit den Überlauf der Register, um $stuff im Speicher zu adressieren Der 286er konnte aber mehr als 1MB Speicher adressieren und sollte abwörtskompatibel sein IBM schuf die Möglichkeit die 20. Adressleitung fest auf GND zu legen Somit war der Überlauf wieder da, es gab allerdings auch nur 1MB adressierbaren Speicher

A20 Gate Existiert heute immernoch Bereitet einem viel Freude Wurde früher vom Keyboard Controller (SRSLY!) gesteuert Heute über Chipsatz Es gibt gefühlte 3 mio. Arten das Ding zu aktivieren

Umschalten in 32 Bit Protected Mode Nachdem wir jetzt mehr als 1MB Ram nutzen können, wollen wir 32 Bit Segmentierung ist fies, 16 Bit sowieso Blos weg da Mit 80386 kam der 32 Bit Protected Mode Wie Protected Mode aus 80286, nur volle 32 Bit - und zwar überall. IA-32 Architektur

Umschalten in 32 Bit Protected Mode Was müssen wir dafür tun? Segmentierung konfigurieren Möglichst so, das wir ein flaches, 4GB großes Segment haben, da wir dieses später eh wieder über Paging unterteilen Mittels GDT Danach im CR0 Register das 0. Bit setzen Mit einem Far-Jump in neues, über GDT beschriebenes, Speichersegment springen Nun stehen uns keinerlei Hilfen vom BIOS mehr zur Verfügung

Virtueller Speicher Einer der Grundpfeiler zur Abschottung einzelner Prozesse Jeder Prozess erhält einen eigenen Adressraum Der Adressraum kann dann via Paging realer Speicher zugewiesen werden Virtueller Speicher ermöglicht setzen einiger Kontrollbits (Privilege Level, NX- Bit, Read/Write etc.) Bei Missachtung dieser Kontrollbits, wird eine Exception geworfen: Page Fault Adressumsetzung passiert transparent in der CPU durch die Memory Management Unit (MMU) Auch andere Inhalte im Speicher möglich, wie z.b. Dateien Optimierung des Speicherverbrauchs durch gleichzeitiges Mappen einzelner Frames in mehrere Adressräumen und evtl. Copy-On-Write Swapping

Paging Wir unterteilen den physikalischen und virtuellen Speicher in gleich große Teile Physikalische Teile nennen wir Frames Virtuelle Teile werden die Pages Jeder Teil ist bei x86 (IA-32) 4KB oder 4MB groß Bei 4KB haben wir also 4GB / 4KB = 1048576 Pages, die wir nun mit Frames befüllen können Ein Page Directory (Mapping von Pages zu Frames) ist also (bei 4B langen Pointern) 1048576 * 4B = 4MB groß zu groß!

Pages Frames Pages Paging Prozess 1 Physikalischer Speicher Prozess 2

Paging Lösung für unser Größenproblem: 2-stufiges Paging Obere 10 Bit der virtuellen Adresse ergeben Index im Page Directory, der auf eine Page Table zeigt Folgende 10 Bit ergeben den Index der Page in der Page Table Letzte 12 Bit sind dann Offset im Frame selbst

Paging Virtuelle Adresse! Directory-Index! Page-Index! Offset! Physikalische Adresse! Basisadresse! Offset! 31 22 21 12 11 0 31 12 11 0 Page Directory! 1023! Page Table! Phys. Adresse des Frames! 1023! Adressen der Pagetables! Phys. Adresse Page Table! 0! Frame-Adresse! 0! Pro Tabelle 1024 Einträge 1 Eintrag = 32 Bit Macht 4KB pro Tabelle

Paging Aktivierung? Page Directory und Page Tables von Hand zusammenbasteln Page Directory Adresse in CR3 schreiben Bit 31 in CR0 setzen Vorsicht: Vom Linker erstelle Adressen stimmen unter Umständen nicht mehr Code muss entweder relokiert werden Oder kleineres Programm vorher initialisiert Paging und springt dann in den eigentlich und korrekt auf die neue Basisadresse gelinkten Kernelcode

Interrupts x86 kann auch Interrupts Prozessor hat 256 verschiedene Interrupts Unterste 32 sind als Exceptions reserviert Prozessor hat (oder hatte... virtualisierter Bus usw.) eine physikalische Interruptleitung An Prozessor hingen 2 PICs (Programmable Interrupt Controller), die Interrupts angenommen haben und an der Prozessorleitung gezogen haben Im Anschluss konnte man die PICs fragen, was los war

PIC PIC 1 (Master) +--------------+ PIC 2 (Slave) IRQ 0 + <--- Timer +-------------+ IRQ 1 + <--- Tastatur IRQ 8 + <--- Echtzeituhr IRQ 2 +------------------+ IRQ 9 + <---... IRQ 3 + <--- Seriell IRQ 10 + <---... IRQ 4 + <--- Seriell IRQ 11 + <---... IRQ 5 + <--- Soundkarte IRQ 12 + <--- PS/2 Maus IRQ 6 + <--- Floppy IRQ 13 + <--- Koprozessor IRQ 7 + <--- Parallel IRQ 14 + <--- Festplatte +------+-------+ Port IRQ 15 + <--- Festplatte +-----+-------+ +--------------+ +--->>> Zur CPU

Interrupts handlen Um Interrupts zu behandeln müsen wir folgendes tun: IDT (Interrupt Descriptor Table) erstellen IDT laden Interrupts aktivieren Für Hardware-Interrupts MUSS der (A)PIC konfiguriert werden

Long Mode Long Mode ist der 64 Bit Modus Aktivierung: In Protected Mode wechseln, Paging aus Paging-Tabellen basteln PAE in CR4 aktivieren (max. 64GB physikalischen RAM) Longmode in MSR (Model Specific Register) aktivieren Paging und Longmode in CR0 aktivieren 64 Bit GDT laden

Multitasking Jeder Task bekommt einige ms CPU-Zeit, danach wird gewechselt Umschalten läuft völlig transparent ab Kompletter State eines Tasks muss gesichert und neuer geladen werden Unterbrechungen finden durch Timer Interrupt statt

Task State x86 kann Hardware Task Switching Wir machen es in Software Gründe: Kaum Geschwindigkeitsnachteile Portabler Zum State gehört: Register Stack evtl. Page Directory

State sichern Die CPU führt fröhlich Instruktionen aus und es passiert ein Interrupt Beim Interrupt werden verschiedene Sachen auf den Stack geschoben, um nachher wieder zurückkehren zu können Die ist ein Teil unserer zu sichernden States Zur Sicherheit schieben wir am Anfang des Interrupts den Rest auch noch direkt auf den Stack Nun brauchen wir uns den Kram nur noch vom Stack holen und in eine struct schreiben und der State ist gesichert

Neuen Task wählen Die Wahl des neuen Tasks kann beliebig kompliziert werden Auswahlkriterien können Zustand sein (wartend/schlafend, ausführend), Priorität, etc. Wir machen hier Round-Robin, also einfach immer den nächsten wählen ohne viele Extras

State wiederherstellen Um den State eines Tasks wieder herzustellen, müssen wir die Register einzeln setzen, alle erwarteten Interrupt- Rücksprungargumente auf den Stack pushen Und ireten Neuer Task sollte laufen

Kurze GeexOS Demo

Fragen? Antworten!