Im Bootprozess wird das System vom start in eienen nominalen zustand
gebracht, dies geschieht folgendermaßen:
1. Beim Systemstart wird ein Resetsignal an die CPU gesendet. 2. Der
IP(Instructionpointer) zeigt auf das BIOS und lädt eine Leseoperation in
das Commandregister, im Anschluss wird der IP um eins erhöht. 3. Das
BIOS macht zunächst einen Memorytest in dem es auf den Arbeitsspeicher
schreibt und das geschriebene wieder ausliest. 4. Nach dem Memorytest
kontrolliert es die BUS-Systeme und welche Geräte vorhanden sind. 5.
Nachdem das BIOS alle vorhanden Geräte erkannt hat sucht es anhand des
MBR(Maste-Boot-Record) nach der Magicnumber die ein boot-fähiges Gerät
kennzeichnet, bei mehreren boot-fähigen Geräten wird ein im vorhinein
priorisiertes Gerät ausgewählt. 6. Der Code der sich im MBR befindet
wird in den Arbeitsspeicher geladen und an hand dieses Codes werden die
Blöcke in der Partition identifiziert, in denen der GRUB(Grand unified
Bootloader) befindet. 7. Der GRUB wird in den Arbeitsspeicher geladen
und liest die Super-Inodes der Partition um die Blöcke zu finden in
denen der Kernel sitzt. 8. Der Kernel wird in den Arbeitsspeicher
geladen und erhält den IP vom GRUB. 9. Der Kernel lädt benötigte Module
nach. 10. Das Root-Filesystem wird gemounted um zugriff auf das
Dateisystem zu gewährleisten. 11. Der Kernel führt Systemd aus. 12.
Systemd startet Dienste und Prozesse gemäß der Konfiguration in den
Runleveln oder der systemd-Unit-Dateien. 13. Systemd startet den
Prozesse des Desktop-Managers und dieser startet hintergrundprozesse zur
Shellaufbereitung. 14. Nun ist das System betriebsbereit und wartet auf
Benutzeranweisungen oder automatisierte Aufgaben.
Das BIOS ist eine Firmware, die in den meisten PCs und früheren
Computern verwendet wird.
Es ist verantwortlich für die grundlegende Hardwareinitialisierung und
den Startvorgang des Computers.
Das BIOS ist in einem nichtflüchtigen Speicher auf dem Motherboard
gespeichert und wird normalerweise aufgerufen, wenn der Computer
eingeschaltet wird.
UEFI ist eine moderne Firmware-Schnittstelle, die das traditionelle
BIOS ersetzt oder ergänzt.
Im Vergleich zum BIOS bietet UEFI eine erweiterte Funktionalität,
darunter Unterstützung für größere Festplatten, schnellere Bootzeiten,
eine verbesserte Sicherheit und die Möglichkeit, eine grafische
Benutzeroberfläche bereitzustellen.
UEFI unterstützt auch die Ausführung von 64-Bit-Code im Gegensatz zum
BIOS, das normalerweise auf 16-Bit-x86-Code beschränkt ist.
UEFI bietet auch eine modulare Architektur, die die Implementierung von
Funktionen von Drittanbietern erleichtert und die
Firmware-Erweiterbarkeit verbessert.
Blockgeräte sind eine wesentliche Komponente in Linux-Systemen, die für die Speicherung und das Management von Daten verwendet werden. Ein Blockgerät, wie zum Beispiel eine Festplatte oder SSD, ermöglicht das Lesen und Schreiben von Daten in festgelegten Blockgrößen. Diese Blöcke sind die kleinste Einheit des Datenaustauschs auf der Hardware-Ebene, und die Operationen, die der Controller eines Blockgeräts ausführen kann, beschränken sich auf das blockweise Lesen und Schreiben.
Die Daten auf einem Blockgerät werden in Blöcken organisiert, deren Größe typischerweise zwischen 512 Bytes und mehreren Kilobytes liegt. Diese Blockgröße ist eine fundamentale Eigenschaft des Geräts, die bestimmt, wie Daten gelesen und geschrieben werden können. Die blockweise Organisation ermöglicht es dem Betriebssystem, effizient mit großen Mengen von Daten umzugehen, indem es diese in handhabbare Einheiten unterteilt.
Obwohl Blockgeräte auf einer niedrigen Ebene mit Blöcken arbeiten, benötigen Benutzer und Anwendungen eine flexiblere und verständlichere Struktur, um mit Dateien zu arbeiten. Hier kommt das Dateisystem ins Spiel, das eine Abstraktionsebene über den physischen Blöcken eines Speichergeräts bietet. Im Kontext von Linux-Dateisystemen werden inodes verwendet, um diese Abstraktion zu implementieren.
Inodes sind Datenstrukturen, die Metadaten über Dateien und Verzeichnisse enthalten, wie beispielsweise Berechtigungen, Eigentümerinformationen und die tatsächlichen Datenblöcke, in denen die Inhalte der Dateien gespeichert sind. Obwohl dieses System mit inodes eine flexible Handhabung von Dateien ermöglicht, bleibt die zugrundeliegende Operation auf Blockgeräten das blockweise Lesen und Schreiben.
In Linux bezieht sich ein Block-/Characterdevice auf eine abstrakte Darstellung eines physischen oder virtuellen Geräts, das von einem Betriebssystem verwendet wird, um auf Speichergeräte zuzugreifen. Diese Geräte können sowohl physische als auch virtuelle Speichergeräte sein, wie beispielsweise Festplatten, SSDs (Solid State Drives), USB-Laufwerke, CD-ROMs, DVDs, und sogar virtuelle Speichergeräte, die von Hypervisoren bereitgestellt werden.
Ein Blockgerät behandelt Daten in Blöcken, während ein Zeichengerät Daten als Strom von Zeichen behandelt. Hier sind die Unterschiede zwischen den beiden:
Beispiel: Eine Festplatte (/dev/sda) ist ein Blockgerät. Wenn man Daten von der Festplatte liest oder darauf schreibt, erfolgt dies in Blöcken fester Größe, z. B. 512 Bytes oder 4 Kilobytes pro Block.
In der Befehlszeile kann man mit dem Befehl “lsblk” eine Liste der Blockgeräte anzeigen lassen:
lsblk
Dies zeigt eine Liste der blockbasierten Geräte wie Festplatten und Partitionen an.
In Linux werden diese Geräte über spezielle Dateien im Verzeichnis /dev dargestellt. Diese Dateien dienen als Schnittstelle zwischen dem Betriebssystem und den physischen oder virtuellen Geräten. Die Verwendung von Block- und Zeichengeräten ermöglicht es dem Betriebssystem, auf eine Vielzahl von Hardwarekomponenten und -ressourcen zuzugreifen und mit ihnen zu interagieren.
Beispiel: Eine Tastatur (/dev/tty0) ist ein Zeichengerät. Wenn man auf der Tastatur tippt, werden die Zeichen sofort einzeln gelesen und können sofort verarbeitet werden, ohne auf einen vollständigen Block von Daten zu warten.
Man kann eine Liste der Zeichengeräte mit dem Befehl “ls /dev” anzeigen lassen:
ls /dev
In Linux beziehen sich “Busoperationen” auf die Kommunikations- und Datentransferprozesse zwischen Hardwaregeräten, die über eine Busarchitektur mit dem System verbunden sind. Ein Bus ist ein Kommunikationssystem, das es verschiedenen Hardwarekomponenten ermöglicht, wie Prozessoren, Speichermodule, Speichergeräte und Ein- / Ausgabegeräte miteinander zu interagieren.
Gängige Bustypen in Linux-Systemen sind:
PCI (Peripheral Component Interconnect): Ein Standardbus, um Peripheriegeräte wie Netzwerkkarten, Grafikkarten und Speichercontroller an den Computer anzuschließen.
USB (Universal Serial Bus): Eine verbreitete Schnittstelle für Peripheriegeräte wie Tastaturen, Mäuse, Drucker und externe Speichergeräte.
SATA (Serial ATA): Eine Schnittstelle für Massenspeichergeräte wie Festplatten und SSDs.
I2C (Inter-Integrated Circuit): Eine serielle Schnittstelle für Niedriggeschwindigkeitsperipheriegeräte.
SPI (Serial Peripheral Interface): Eine serielle Schnittstelle für Mikrocontroller und Peripheriegeräte wie Sensoren und Displays.
UART (Universal Asynchronous Receiver/Transmitter): Eine serielle Schnittstelle für Datenübertragung zwischen Geräten.
Im Kern jedes Computersystems stehen zwei fundamentale Speicherarten: der Massenspeicher (wie Festplatten und SSDs) und der Arbeitsspeicher (RAM). Diese Speichertypen erfüllen unterschiedliche Funktionen und weisen spezifische Charakteristika auf, die für die Arbeitsweise eines Computers entscheidend sind.
Massenspeichergeräte sind für die langfristige Datenspeicherung konzipiert. Sie speichern Daten in Blöcken, wobei ein Block die kleinste Einheit ist, die gelesen oder geschrieben werden kann. Diese Blockgröße variiert je nach Speichertechnologie und kann mehrere Kilobytes groß sein. Der blockweise Zugriff bedeutet, dass bei jedem Lese- oder Schreibvorgang mindestens ein ganzer Block bearbeitet wird, auch wenn nur ein kleiner Teil der Daten tatsächlich benötigt wird. Diese Art des Zugriffs optimiert die Speicherung großer Datenmengen und die Effizienz des Datentransfers, kann aber bei kleinen, häufigen Operationen zu Ineffizienzen führen.
Im Gegensatz dazu ermöglicht der Arbeitsspeicher (RAM) einen Zugriff auf Byte- oder Wortebene, was deutlich feingranularere Operationen zulässt. Der RAM ist darauf ausgelegt, Daten temporär zu speichern, auf die der Prozessor (CPU) schnell zugreifen muss. Die Möglichkeit, Daten auf Wortebene zu manipulieren, ist entscheidend, da die CPU sehr kleine, spezialisierte Speicherbereiche namens Register verwendet. Diese Register, die direkt innerhalb der CPU liegen, sind nur in der Lage, sehr kleine Datenmengen – typischerweise die Größe eines Wortes oder eines Doppelwortes – gleichzeitig zu halten und zu verarbeiten. Die Kompatibilität der Zugriffsweise des RAMs mit der Größe dieser Register ist entscheidend für die schnelle Ausführung von Programmen und die Verarbeitung von Anweisungen.
Um Daten aus dem Massenspeicher zu verarbeiten, müssen diese zunächst in den Arbeitsspeicher übertragen werden. Dies geschieht blockweise, da der Massenspeicher nur blockweisen Zugriff erlaubt. Nach der Übertragung in den RAM können die Daten dann byte- oder wortweise weiter an die CPU gesendet werden, wo sie in den Registern verarbeitet werden. Diese Übertragungskette von Massenspeicher über Arbeitsspeicher zur CPU ist fundamental für die Funktionsweise moderner Computer.
Der Hauptunterschied zwischen Massenspeicher und Arbeitsspeicher liegt in der Art des Datenzugriffs: Massenspeichergeräte ermöglichen einen blockweisen Zugriff, der für die langfristige Speicherung und Effizienz bei der Verwaltung großer Datenmengen optimiert ist. Der Arbeitsspeicher hingegen erlaubt einen feingranularen Zugriff auf Byte- oder Wortebene, was eine schnelle Datenverarbeitung durch die CPU unterstützt. Die Übertragung von Daten vom Massenspeicher in den Arbeitsspeicher und schließlich zur Verarbeitung in die CPU ist ein Kernprozess, der die Leistung und Effizienz eines Computer systems maßgeblich bestimmt.