Was ist Memory-Mapped I/O?
Ein I/O Controller besteht aus einer Vielzahl von Registern, welche auf zwei
Varianten adressiert werden können:
Memory-Mapped I/O, um den konventionellen Adressraum verschiedenen
I/O-Devices zuzuordnen oder Getrennten I/O Adressraum, bei dem auf
einer speziellen Adressleitung die E/A-Adresse auf den Bus gelegt wird.
(veraltete Variante)
Was ist eine Task?
Ein Task ist ein eigenständiges Programm / Prozess von vielen im
Multitasksystem. Es wird von einem TSS (Task State Segment)
beschrieben. Bei einem Taskwechsel werden alle Informationen in diesem TSS
gespeichert. Jeder TSS-Deskriptor steht in der GDT. Die GDT hat
beim i486 8192 Einträge, jedoch ist der 0. Eintrag immer leer. Somit sind maximal
8191 verschiedene Prozesse möglich (inclusive des Betriebssystems).
Wie werden Task-Wechsel realisiert?
Ein Taskwechsel geschieht durch Auswahl eines Task-Gates aus Globaler
Deskriptor Tabelle (Task State Segment = TSS). Ein TSS Enthält alle Informationen,
die einen Task ausmachen:
- verwendete Prozessor-Register
- LDT-Selektor (einer Pro Task) welche die Segment-Deskriptoren des Prozesses enthält
- Stack-Segment-Pointer
- Verwaltungsinformation
- Adresse der Paging-Tabellen
- I/O-Map Base Adresse
- Busy-Bit, definiert den aktuell rechnenden Task (genau einer im System)
TR (Task Register)
- enthält den aktuellen TSS (Selektor des Descriptors des aktuellen TSS)
- TSS-Descriptoren nur in GDT!
Bsp: Scheduler als Task ( Umschalter )
Umschalten durch jeweiligen Austausch des Back-Link, IRETD zum anderen Task, z.B.
Timer-Interrupt-Task.
Welche Möglichkeiten für Privilegwechsel gibt es?
- CALL in eine Prozedur mit anderen Privilegde-Level (CALL-Gate)
- JMP in eine Prozedur mit anderen Privi legde-Level (TASK-Gate)
- INT (TRAP-Gate)
- TASK-Gate durch erzwungenen Prozeßwechsel
- IRET Rücksprung aus INT-Handler
Was ist der Unterschied zwischen einem Selektor und einem Deskriptor?
Ein Selektor Segment-Register wählt einen Deskriptor in (GLI)DT aus, ein
Deskriptor Eintrag in (GLI)DT, beschreibt das Segment.
Weshalb ist es sinnvoll, dass ein TSS-Descriptor nur in der GDT stehen darf?
Es soll verhindert werden, daß ein USER-Programm in einen anderen Task
springt. Da Taskwechsel nur über TASK-Gates erfolgen (dieses zeigt auf einen
TSS-Deskriptor) muß der CurrentPrivilegdeLevel (CPL vom CS:) numerisch kleiner
sein, als das des geforderten TSS-Deskriptor (DPL) bzw. kleiner als der (RPL) des
Segments wo sich der TSS-Deskriptor aufhält. Damit wird sichergestellt, daß der
Taskwechsel nur von "höherem" Code (OS) aus ausgeführt werden kann. Würde ein
TSS-Deskriptor in der LDT stehen, könnte es dort mit einem höheren RPL versehen
werden, und der USER-Code könnte sich zum OS-CODE etablieren!
Welche Grundtypen von Deskriptoren gibt es?
IDT | LDT | GDT |
| CODE-Segment DATA-Segment STACK-Segment | CODE-Segment DATA-Segment STACK-Segment |
INT-Gate TRAP-Gate TASK-Gate | TASK-Gate | TASK-Gate CALL-Gate |
Welche grundlegenden Adressierungsarten gibt es?
- Unmittelbare Adressierung
- Direktadressierung (Direct Adressing)
- Registeradressierung
- Indirekte Registeradressierung
- Indizierte Adressierung
- Basisindizierte Adressierung
- Stapeladressierung
Unmittelbare Adressierung
- Der Adressteil der Instruktion enthält den Operanden selbst, anstatt eines Verweises.
- Solche Operanden werden als Direktoperanden (Immediate) bezeichnet
- Bsp: MOV R4, 5H (5H wird direkt in R4 gespeichert)
Direktadressierung (Direct Adressing)
- Es wird eine volle Adresse des Operanden angegeben
- Deshalb nur für globale Variablen anwendbar, da Instruktion immer auf gleiche Speicehrzeile zugreift
Registeradressierung
- Das gleiche Prinzip wie Direct Adressing, nur das Register anstelle von Speicherzellen verwendet werden
- In Registern sollten die am häufigsten verwendeten Variablen abgelegt werden, da Register vielfach schneller als Hauptspeicher sind
- Load/Store-Architekturen nutzen fast nur diesen Registermode (außer es muss vom oder zum Speicher transferiert werden)
Indirekte Registeradressierung
- Die Adresse wird nicht direkt angegeben, sondern indirekt über ein Register
- Das Register enthält somit einen Pointer auf eine Speicherzelle
- Vorteil ist, daß auf Speicher referenziert werden kann, aber keine volle Speicheradresse notwendig wird
Indizierte Adressierung
- Der Speicher wird durch Angabe eines Registers und eines konstanten Offsets adressiert
- Häufig benutzt bei Arrayzugriffen, wie A = B[i] (MOV R1, B[R2])
Basisindizierte Adressierung
- Speicheradresse wird hier durch Addition zweier Register und einen optionalen Offset berechnet
- Eines der Register stellt die Basis dar und ein anderes den Index
Stapeladressierung
- Hier ist gar keine Adressangabe notwendig
- Somit sind die Instruktionen sehr kurz
- Die Stapeladressierung arbeitet mit der umgekehrten polnischen Notation (Postfix)