Technische Informatik Klaus-Dieter Thies Echtzeit-Multitasking Memory Management und System Design im Protected Mode der x86/pentium-architektur. Shaker Verlag Aachen 2002
Die Deutsche Bibliothek - CIP-Einheitsaufnahme Thies, Klaus-Dieter: Echtzeit-Multitasking : Memory Management und System Design im Protected Mode der x86/pentium-architektur / Klaus-Dieter Thies. Aachen : Shaker, 2002 (Technische Informatik) ISBN 3-8265-9954-3 Copyright Shaker Verlag 2002 Alle Rechte, auch das des auszugsweisen Nachdruckes, der auszugsweisen oder vollständigen Wiedergabe, der Speicherung in Datenverarbeitungsanlagen und der Übersetzung, vorbehalten. Printed in Germany. ISBN 3-8265-9954-3 ISSN 1436-882X Shaker Verlag GmbH Postfach 1290 52013 Aachen Telefon: 02407 / 95 96-0 Telefax: 02407 / 95 96-9 Internet: www.shaker.de email: info@shaker.de
Die vorliegende Arbeit wendet sich an System-Designer und Betriebssystem-Entwickler, sowie an Software-Entwickler, die den protected mode der x86/pentium-architektur nutzen wollen. In diesem mode "betrachtet" die Architektur das Software-System (das Betriebssystem genauso wie die Anwendungen) als eine Anzahl asynchroner Tasks. Jede Task kann aus maximal 4 Privilegebenen bestehen, von denen jede einen individuellen Grad an Software-Schutz gewährt. Ein x86/pentium-betriebssystem muss mit Hilfe der Hardware die Aktivitäten vieler Tasks koordinieren und den Schutz zwischen den Tasks und innerhalb der Tasks zwischen den Privileg-Ebenen verwalten. Tasks Eine Task ist die Ausführung einer Sequenz von Instruktionen. Ein Programm ist eine logische Einheit, die viele Repräsentationen haben kann: Zum Beispiel eine source code-datei oder eine object program-datei. Ein Programm wird zur Task, wenn es aktuell für die Ausführung verfügbar ist. Dies wird erreicht durch die Konvertierung des source codes (z. B. mit einem Compiler, einem Assembler oder einem Programmlader) in eine Repräsentation, die für die Ausführung geeignet ist, und der Bekanntgabe an das Betriebssystem, dass die Task für die Installation und Ausführung bereit ist. Der Unterschied zwischen Programmen und Tasks kann am besten an Multitasking-Systemen geklärt werden. Dort ist es möglich, dass zwei oder mehrere Tasks ein Programm simultan ausführen. Ein Zeileneditor-Programm in einem timesharing-system ist ein allgemeines Beispiel. Obwohl jede Zeileneditor-Task das gleiche Programm benutzt, liefert jede Task unterschiedliche Ergebnisse, denn jede Task wird mit individuelle Eingaben "versorgt". Segmentierter Speicher Die x86/pentium-architektur bildet den virtuellen Adressraum einer Task auf physikalische Segmente variabler Länge ab. Ein physikalisches Segment ist ein zusammenhängender Block von Speicher und überlappt sich im Regelfall nicht mit einem anderen physikalischen Segment. Jedes physikalische Segment einer Task enthält ein oder mehrere logische Segmente, die ihrerseits die Organisation der Task als Code-, Daten- und Stack-Region reflektieren. Pageorientierter Speicher Jedes x86/pentium-betriebssystem implementiert normalerweise eines der möglichen Segmentierungsmodelle, doch paging ist optional. Obwohl paging typischerweise zur Implementierung eines virtuellen Speichers eingesetzt wird, kann es wegen seiner Leistungsmerkmale auch für andere Anwendungen benutzt werden. Zum Beispiel: Virtuelle 86 mode-tasks generieren Adressen, die im ersten 1 Megabyte des linearen Adressraums liegen. Ein Betriebssystem, das mehrere solcher Tasks unterstützt, kann paging benutzen, um deren Adressen auf unterschiedliche pages im physikalischen Adressraum abzubilden. Alle pages haben die gleiche Grösse von 4 K Bytes. Sie können deshalb relativ "bequem" während der Disk-Transfers aus- und eingelagert werden. In Echtzeit-Betriebssystemen ist der pageorientierte Speicher nicht empfehlenswert, denn bedingt durch die sogenannten swapping-zeiten (aus- und einlagern der pages) reduzieren sich die Antwortzeiten der Tasks.
Multitasking Die x86/pentium-architektur stellt alle Mechanismen zur Unterstützung von Multitasking bereit. Eine Task wird entweder durch einen Interrupt, eine Ausnahmesituation, einen jump oder einen call aufgerufen. Jede dieser Formen bezieht sich auf einen speziellen Deskriptor in einer der Deskriptor-Tabellen. Dieser Deskriptor bewirkt einen Wechsel von der augenblicklichen Task zu einer neuen Task, nachdem der Status der "austretenden" Task in ein spezielles Segment gerettet worden ist. Ein Taskwechsel ist mit einem Funktionsaufruf vergleichbar. Der Unterschied ist, dass bei einem Taskwechsel mehr Prozessorstatus- Informationen gerettet werden als beim Prozduraufruf. Nach dem Wechsel befindet sich der Prozessor in einer komplett neuen Umgebung. Das Buch besteht aus 11 Kapiteln Kapitel 1 beschreibt das Basis-Programmier-Modell des x86/pentium und führt den Leser in diejenigen Eigenschaften ein, die vor allem für die Entwicklung und Implementierung von Anwender-Programmen von Interesse sind. Kapitel 2 zeigt das segment- und pageorientierte Memory Management, die virtuelle Adressierung und die Mechanismen des Cache-Speichers in Single- und Multiprozessor-Systemen. Kapitel 3 beschreibt die Wechselwirkungen zwischen dem Memory Management und dem implementierten Schutz wie Segment-Schutz, Page-Schutz und Privileg-Ebenen. Kapitel 4 erklärt die Mechanismen des Multitasking sowohl in segment- als auch in pageorientierten Systemen. Kapitel 5 zeigt detailliert die Funktionsabläufe bei der Interrupt-Verarbeitung. Kapitel 6 fasst alle möglichen Ausnahmesituationen zusammen und beschreibt deren Behandlung Kapitel 7 Kapitel 8 erklärt die Bus-Transfer-Mechanismen und zeigt den Zusammenhang zwischen Schutz und I/0-Zugriffen. enthält eine komplette Einführung in die Architektur, das Zahlensystem und die Numerik-Mechanismen der Floating Point-Einh'eit. Kapitel 9 erklärt die wichtigsten Sprachelemente des System Builders BLD386 und zeigt den Entwurf statischer Grundsysteme im Protected Mode. Kapitel 10 zeigt, wie Real Mode-Programme (z.b. DOS-Programme) als virtuelle Tasks in der geschützten Protected-Mode-Umgebung zum Ablauf gebracht werden. Kapitel 11 beschreibt, auf welche Weise der DEBUG-Prozeß unterstützt wird.
Alle dargestellten Themen werden von Programmierbeispielen begleitet, die dem Leser Beispiele für die Entwicklung eigener Systemsoftware geben, oder ihn bei der Interpretation bereits vorhandener Systemsoftware unterstützen. Hinweis: Im Text taucht manchmal der Prozessorname 80486 auf. Er ist ein Synonym für die Prozessorfamilie 80386..PentiumX, denn alle beschriebenen und dargestellten Strukturen und Mechanismen sind software-transparent und gelten für alle Mitglieder der Familie. Klaus-Dieter Thies DSc