160 likes | 254 Views
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
E N D
AKBPII:Abschlusspräsentation NE2000: Hardware und Design eines prototypischen Treibers bearbeitet von Manuel Götz, Stefan Gabriel NE2000: Hardware und Design eines Treibers
Ü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 NE2000: Hardware und Design eines Treibers
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 Aufbau einer NE2000-Karte: Allgemeines Netz FIFO Speicher BS NE2000: Hardware und Design eines Treibers
PROM: Ethernet-Adresse Puffer: - eingehende Pakete - zu sendende Pakete 0x0000 0x001F 0x4000 0x8000 0xC000 0xFFFF Aufbau einer NE2000-Karte: Speicherlayout PROM Aliased PROM Puffer Aliased PROM Aliased Puffer NE2000: Hardware und Design eines Treibers
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 Aufbau einer NE2000-Karte: Puffer Zu versendende Pakete Eingehende Pakete (Ringpuffer) NE2000: Hardware und Design eines Treibers
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: Status Next Page Length (L) Length (H) NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
Design des Treibers: Allgemeines • Ebene des Treibers (im TCP-IP-Schichtenmodell) TCP IP Ethernet Treiber Hardware (spezifisch) NE2000: Hardware und Design eines Treibers
Design des Treibers: Klassen 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 NE2000Finder.java NE2000.java Register.java Message.java NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
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 NE2000: Hardware und Design eines Treibers
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. NE2000: Hardware und Design eines Treibers
Vielen Dankfür ihre Aufmerksamkeit! NE2000: Hardware und Design eines Treibers