Inhaltsverzeichnis
Allgemein
Ein Betriebssystem ist ganz allgemein und ungefähr das, was zwischen User-Applikation und Hardware an Programmen und Funktionen abläuft. Das kann man dann noch noch in weitere Schichten teilen.
Wichtig für uns an dieser Schichten-Teilung ist Folgendes:
- Jede Schicht bietet der direkt darüberliegenden eine Reihe von Funktionalitäten, die von dieser über ein Interface (Schnittstelle) angesprochen werden können.
- Keine solche Schicht sollte übersprungen werden können („sollte“, weil in der Praxis das nicht immer eingehalten wird).
Der Zweck ist schon klar: Das User-Programm soll sich keine Gedanken machen müssen, welche Schalter wo betätigt werden, um irgendeine Hardware-Aktion auszulösen.
Die Aufgaben:
Starten & Initialisieren (Boot)
Beim PC kann man diesen Vorgang sehr schön beobachten. Wenn man zum Beispiel keine Festplatte drin hat, umfaßt dieses "Booten" alles das, was der PC macht, bevor er schreibt "No System Disk".
- Rechner-Initialisierung
- Peripherie-Startup
- Eigentliches Betriebs-System Laden & Starten.
Das ist nun der oben erwähnte Moment, in dem sich entscheidet, ob irgendein Windows, Linux oder sonst was läuft.
Applikationen Laden & Ausführen
Im Grunde heißt das nicht mehr, als eine File in den Arbeitsspeicher zu laden und den Befehlszähler (Program Counter) auf den ersten Maschinenbefehl darin anzusetzen und ab da die CPU einfach werken zu lassen.
Multi-User/Multi-Task
Eigentlich alle gängigen Computer (und Betriebssysteme) tun aber so, als könnten sie viele solche Applikationen nebeneinander und völlig getrennt für verschiedene Benutzer gleichzeitig ausführen. Teils stimmt das ja auch, größtenteils aber ist es eine Täuschung, denn in Wirklichkeit läuft mal dieser, mal jener Task, aber der Wechsel geschieht so schnell, daß die Illusion der Gleichzeitigkeit entsteht.
Task/Prozess
Wir wollen die Sache mit den "Multi-Usern" in der Folge einfach mal vergessen. Da geht's hauptsächlich nur um "Berechtigungen" und "Privilegien". Doch was ist nun ein Task (oder Prozess) ?
- Der Maschinencode
- Ein kompletter Satz Register
- Ein eigener Stack
Multi-Threading
So etwas kann man auch als "Thread" bezeichnen, und das Bild eines "Threads" in einem Roboternetz-Forum ist garnicht so weit weg. Ich kann (normalerweise) immer nur einen lesen, ich kann aber hin- und herspringen. Und ich hab immer die gleichen Buttons, trotzdem geht's in jedem Thread um was ganz anderes.
Multi-Threading ist also: mehrere Programme für verschiedene Aufgaben
mit Stack und Registern zu versorgen und die gemeinschaftliche Hardware
so zu verwalten, daß jeder seinen Teil bekommt.
Und um so einen Threadwechsel durchzuführen, muß also von einem Thread-Kontext (Register & Stack) auf einen anderen umgeschalten werden, ohne daß das Programm beeinträchtigt wird
Kontrolle der Ressourcen
Da ja die gesamte Hardware für alle ja trotzdem nur ein einziges Mal da ist, müssen natürlich Konflikte vermieden oder sonstwie abgehandelt werden. Da gibt es Mechanismen wie "Spin-Locks", "Semaphores", "Mutex", "Critical Sections" und was weiß ich noch, die alle diesem Zweck dienen.
Shutdown
Beim Pc ist es das, was bei "Computer ausschalten" passiert. Dauerhaftes Speichern auf die Platte, etc. Bei Mikrokontrollern gibt es sowas eigentlich nur beim geordneten Wechsel in den "Sleep" oder "Idle"-Mode, ansonsten wird meist einfach der Strom abgedreht.
Betriebssystem und Mikrocontroller
Ein zum PC oder Großrechner vergleichbares Betriebssystem gibt es nicht. Das hat mehrere, durchaus verständliche Gründe:
- Overhead Das bißchen Platz, daß man hat, will man nicht mit allgemeinen Routinen für die meist hochspezialisierten User-Probleme belegen. Und natürlich, jede Instruktion, die zusätzlich zu den User-Befehlen abläuft, kann schmerzen.
- Fest gespeicherte Programme (Flash) Betriebsmäßiges Programmladen oder -wechseln ist für den Flash-Speicher nicht sinnvoll.
- Keine Standards Bei den MCU ist die ähnliche Situation wie bei den Intel-CPUs, bevor Bill Gates kam. Es gab ein Konzept für Vektor-Tabellen (Software-Interrupts) und sonst eigentlich auch nix.
Es gibt auf den MCUs z.B. keine verbindlichen call und stack-standards.
Firmware
Das, was man beim Mikrocontroller vorfindet, könnte man als „Firmware“ bezeichnen, die durch Flags und Werte in den I-O Registern kontrolliert kann.
- Starten & Initialisieren
Es werden die I-O Register auf definierte Werte gesetzt, der Befehl an der Adresse 0000 wird ausgeführt.
- Shutdown
Der Shutdown besteht üblicherweise einfach aus dem Entzug der Stromzufuhr.
- Sonderfunktionen
Alle anderen Betriebs-System-Funktionalitäten, wenn es sie gibt, sind Teil des User-Programmes.
Interpreter
JAVA, Basic Stamp, RCX…
Das im Flash gespeicherte Programm ist ein Interpreter, der die eigentliche User-Anwendung, meist in Form von Meta-Commands, unabhängig, vielleicht auch in einem eigenen physischen Speicher geladen hat oder ggf. nachlädt. In diesen Fällen könnte man vielleicht von einem Betriebssystem sprechen. Aber durch die Abhängigkeit von dem Compiler /Encoder ist die Eigenständigkeit nicht gegeben.
Es bleibt irgendwie eine Interpretationssache.
Multithreading für Kontroller
Der Mikrokontroller unterscheidet sich ja vom (Mikro)-prozessor, weil er auch zusätzlich eine Reihe von "Geräten" eingebaut hat, die es zu kontrollieren gilt.
Synchron
Man kann diese Geräte nun sozusagen "normal" betreiben, d.h. im Programmfluß wird ein Gerät
- initialisiert und eingestellt mit diversen Parametern
- gestartet
Nun läuft die Funktionalität ab, das Hauptprogramm wartet auf das Fertigwerden
- Fertig
Das Ergebnis wird ausgewertet und es geht wieder weiter
Asynchron
Es können "Interrupts", also Unterbrechungen definiert werden, die eine Art Multi-Threading ermöglichen. In diesem Falle wird das Gerät zwar wie oben
- initialisiert und eingestellt mit diversen Parametern
- gestartet
Aber nun läuft das Programm einfach weiter und kümmert sich nicht mehr.
Ist das Gerät mit seiner Funktion nun irgendwann einmal fertig, wird der normale Programmablauf einfach dort gestoppt, wo es halt grad ist, und an dessen Stelle wird eine sogenannte ISR-Routine ausgeführt, die erst durch einen bestimmten Befehl (RETI) wieder die Rückkehr ins Hauptprogramm zuläßt.
Für das Hauptprogramm ist diese Unterbrechnung nicht direkt erkennbar.
Artikel PickNick