akbpii: abschlusspräsentation
DESCRIPTION
AKBPII: Abschlusspräsentation. NE2000: Hardware und Design eines prototypischen Treibers bearbeitet von Manuel Götz, Stefan Gabriel. Übersicht:. Aufbau einer NE2000-kompatiblen Karte -Allgemeines -Speicherlayout -Puffer -Register Design des Treibers -Allgemeines -Klassen - PowerPoint PPT PresentationTRANSCRIPT
22.3.2004 NE2000: Hardware und Design eines Treibers
1
AKBPII:Abschlusspräsentation
NE2000:
Hardware und Design eines
prototypischen Treibers
bearbeitet von Manuel Götz, Stefan Gabriel
22.3.2004 NE2000: Hardware und Design eines Treibers
2
Übersicht:
• Aufbau einer NE2000-kompatiblen Karte- Allgemeines- Speicherlayout- Puffer- Register
• Design des Treibers- Allgemeines- Klassen- Starten des Treibers und Initialisieren der Karte- Versenden von Paketen- Empfangen von Paketen
• Beschreibung des erstellten Treibers
22.3.2004 NE2000: Hardware und Design eines Treibers
3
Aufbau einer NE2000-Karte: Allgemeines
• Bei der Entwicklung nie als Standard gedacht gewesen
• Kein Shared Memory
• Zugriff über den IO-Port
möglich
• Zugriff nur auf Speicher möglich
• Interner Zwischenpuffer: FIFO
• Für Lesezugriff auf Speicher:
9 Zugriffe auf Register nötig
• Schreiben: 7 Zugriffe auf Register
Netz
FIFO
Speicher
BS
22.3.2004 NE2000: Hardware und Design eines Treibers
4
Aufbau einer NE2000-Karte: Speicherlayout
• PROM:
Ethernet-Adresse
• Puffer:
- eingehende Pakete
- zu sendende Pakete
PROM
Aliased PROM
Puffer
0x0000
0x001F
0x4000
0x8000
0xC000
0xFFFF
Aliased PROM
Aliased Puffer
22.3.2004 NE2000: Hardware und Design eines Treibers
5
Aufbau einer NE2000-Karte: Puffer
• Puffer sowohl für zu versendende als
auch für eingehende Pakete
• Zugriff durch Treiber über den IO-Port möglich (und nötig)
• Adressen zwischen 0x4000
und 0x8000
• Unterteilt durch Register
(TPSR, PSTART, PSTOP);
gesetzt beim Initialisieren
TPSR
PSTART
PSTOP
Zu versendendePakete
EingehendePakete
(Ringpuffer)
22.3.2004 NE2000: Hardware und Design eines Treibers
6
Aufbau einer NE2000-Karte: (Ring-)Puffer
• Current Pointer:
Zeiger auf nächste zu schreibende Seite
• Boundary Pointer:
Zeiger auf letzte gelesene Seite (256 Byte)
• Auf Umbruch ist beim Boundary Pointer selbst zu achten
• Innerhalb von PSTART und PSTOP
• Struktur des Headers eines
eingehenden Pakets:
StatusNext PageLength (L)Length (H)
22.3.2004 NE2000: Hardware und Design eines Treibers
7
Aufbau einer NE2000-Karte: Register
• Wichtigste Register:
- Command Register:
Wahl von Registerseiten, Remote DMA aktivieren oder abschalten
- Interrupt Status Register: Auslesen der Art der Interrupts
22.3.2004 NE2000: Hardware und Design eines Treibers
8
Design des Treibers: Allgemeines
• Ebene des Treibers (im TCP-IP-Schichtenmodell)
TCP
IP
Ethernet
Treiber
Hardware (spezifisch)
22.3.2004 NE2000: Hardware und Design eines Treibers
9
Design des Treibers: Klassen
NE2000Finder.java
NE2000.java
Register.java Message.java
Meldet Karte im System an
Ruft richtigen Konstruktor auf
Hilfsklasse zum Lesen und Hilfsklasse zum Speichern
Schreiben von Speicher von ein- und aus-
und Registern gehenden Paketen
22.3.2004 NE2000: Hardware und Design eines Treibers
10
Design des Treibers: Starten des Treibers
• NE2000Finder.java wird über boot.rc aufgerufen
• Suche nach NE2000-kompatiblen Karten im Rechner
• Erkennen der speziellen Karte
• Prüfen, ob PCI- oder ISA-Karte gestartet wird
• Starten des benötigten Konstruktors
• Aufruf der open-Methode zum Initialisieren der Karte
• Anmeldung der Karte im System
22.3.2004 NE2000: Hardware und Design eines Treibers
11
Design des Treibers: Initialisieren der Karte
• 13 initiale Schritte nötig
• Die Wichtigsten sind:
- Hardware-Reset
- Einstellungen für DMA im DCR (Data Configuration Register)
- Spezifizieren der anzunehmenden Pakete im RCR
(Receive Configuration Register)
- Konfigurieren des Ringpuffers (BNRY, CURR, PSTART, PSTOP)
- Vorbereiten des Empfangs der gewünschten Interrupts
durch Löschen von ISR (Interrupt Status Register) und Setzen
von IMR (Interrupt Mask Register)
- Schreiben der Ethernet-Adresse in PAR0-5 (Physical Address
Register)
- Setzen des Start-Mode im Command-Register
22.3.2004 NE2000: Hardware und Design eines Treibers
12
Design des Treibers: Versenden von Paketen
• 2 Methoden: transmit(...) und transmit1(...)
• Prüfen, ob noch ein Versendevorgang aktiv ist
• Schreiben der Anfangsadresse des Pakets im Puffer der Karte
in das TPSR (Transmit Page Start Register)
• Schreiben der Länge des Pakets in die TBCR0/1 (Transmit
Byte Count Register)
• Schreiben des Pakets in den Puffer
• Starten des Versendevorgangs mit dem Command-Register
Vorsicht:
Synchronisieren von
- transmit untereinander
- Schreiben in den Puffer
22.3.2004 NE2000: Hardware und Design eines Treibers
13
Design des Treibers: Empfangen von Paketen
Auslesen aus dem Ringpuffer:
• Nach Ankommen eines Pakets im Ringpuffer: Interrupt
• Auslesen des Pakets aus dem Ringpuffer
• Speichern in MultiThreadList
• Wenn weitere Pakete: Schleife bis alles ausgelesen
• Freigeben der Interupts
• Nochmal Prüfen, ob Paket angekommen ist
Übergeben an höhere Schicht:
• Thread meldet sich beim Treiber an
• Wird bei Ankommen eines Pakets geweckt
• Liefert die gesamte Liste an die höhere Schicht
• Legt sich wieder schlafen
22.3.2004 NE2000: Hardware und Design eines Treibers
14
Beschreibung des erstellten Treibers
• Verwirklicht:
- Treiber läuft (getestet) für 2 Netzwerkkarten (Winbond und
Realtek), trotz leichter Unterschiede in den Karten
- Anwendung in PCI- und ISA-Modus möglich, hängt nur von
den Startparametern in der boot.rc ab
• Noch zu Realisieren:
- Auslesen der Pakete nicht mehr im Interrupthandler, sondern
in einem eigenen Thread:
Interruptlatenzzeit wird gesenkt
22.3.2004 NE2000: Hardware und Design eines Treibers
15
Beschreibung des erstellten Treibers
• Größte Schwierigkeit:
Ringpuffer, Setzen des Boundary Pointers
• Problem:
Boundary Pointer muss auf Seite vor Beginn des Pakets zeigen.
• Grund:
Sind Current Pointer und Boundary Pointer gleich, schließt Karte
auf Pufferüberlauf.
22.3.2004 NE2000: Hardware und Design eines Treibers
16
Vielen Dankfür ihre Aufmerksamkeit!