Nachdem wir uns einig sind, dass ein HAL eine Abstraktion ohne Code ist, kann ich ja noch ein bisschen Senf draufkippen.
Du vergisst den MCA, dort ging das auch. Aber es gab m.W. keine MCA-auf-MCA-Brücken.
Nebst dessen das MCA zwar P&P hatte aber wimre nicht in der Lange war die Karten ihrer realen physischen Position auf dem Main-Board (Slot-Nummer o.ä.) zuzuordnen.
Die Ressourcen einer MCA-Karte sind m.W. von ihrer physischen Slot-Position abhängig.
Es sind trotzdem Busse. Und wenn du eine USB-PCI-Bridge haben könntest, dann liegt dahinter irgendwo trotzdem ein PCI-Bus.
Ich finde Du klammerst Dich zu arg an dem Wort Bus fest.
Eine Frage der Sichtweise. Ein Bus ist für mein Verständnis das Teil, wo ich Daten auf einer Seite reingebe und Daten auf der anderen Seite rauskommen. Das schließt I²C, SPI und USB mit ein.
Dass du unter Bus etwas PCI-artiges verstehst, ist eine andere Sichtweise. Wenn du nur hochgezüchtete Bussysteme als Bus bezeichnen möchtest, fallen die simplen µC-Busse natürlich aus dem Rahmen.
Ich betrachte den ganzen Krempel eher aus Sicht der Software, also schaue ich
durch die Abstraktion auf den physischen Teil. Und da besteht ein Bus in erster Linie aus Daten, die hindurchgehen, die ein Ziel (oder eine Quelle) haben. Dazu kommt dann noch ein Anteil durch die Abstraktion rein, der die Unterschiede zwischen den Bussen wegabstrahiert. Also Erkennung angeschlossener Geräte (Probing oder harte Konfiguration eingeschlossen), die Konfiguration der Ressourcen (auf Hardwareseite), Übermittlung von Ereignissen (HotPnP, Überspannung) und so weiter.
Am Ende ist der Bus nur ein Medium, wo du Daten reinkippen und rausholen kannst.
PCI kennst Speicher- und IO-Ressourcen und jeder Teilnehmer kann welche anbieten aber auch selbstständig auf die Angebote anderer Teilnehmer zugreifen.
USB hingegen kennt nur Kommunikations-Pipelines die auch immer mit einem Ende bei einem Host-Controller (quasi der Wurzel des USB-Baums) enden müssen und auch nur der Host kann von sich aus aktiv werden alle Devices müssen grundsätzlich auf das Polling vom Host warten.
Das sind Unterschiede, die durch eine gute Abstraktion vernichtet werden sollten.
Zwischen PCI und USB gibt es IMHO keine funktionalen Übereinstimmungen so das es wohl absoluter Blödsinn ist beide hinter einer gemeinsamen Abstraktion zu verstecken, nebst dessen das es keine Geräte mit identischer Ansteuerung für PCI und USB gibt.
Aha. Datenübertragung, der Sinn eines jeden Bussystems, ist also keine Gemeinsamkeit von PCI und USB. Das ist mir neu.
Noch nicht einmal die Vendor-IDs sind identisch vergeben so das man schon bei den elementarsten P&P-Funktionen zwischen PCI und USB unterschieden muss.
PCI mit I²C oder SPI in einen Topf zu werfen macht IMHO noch viel weniger Sinn da die Unterschiede nur noch mehr werden.
Du verstehst, glaube ich nicht, was ich mit Abstraktion meine.
Eine Abstraktion für Bussysteme ist eine Sammlung von Funktionen, also eine API, die der Treiber benutzen kann, um mit der am Bus angeschlossenen Hardware zu reden. Das heißt nicht, dass du einen großen, gemeinsamen Treiber für PCI und I²C entwickeln sollst!
Das heißt nur, dass dein PCI-, USB- und auch I²C-Treiber eine einheitliche Sammlung von Funktionen bereitstellen - die dann von den jeweiligen Hardwaretreibern genutzt wird. Jeder Treiber für eine Bus-Bridge stellt ebenfalls diese API bereit und schon funktioniert dein Temperatursensor für I²C, wenn du ihn an eine USB-I²C-Bridge anschließt, aber der gleiche Treiber kann auch die Temperatur vom Mainboard lesen oder vom DDC-Teil des VGA-Anschlusses.
Für jedes Bussystem hast du trotzdem einen eigenen Treiber. Alles andere ist Blödsinn.
Wenn man wirklich PCI über USB tunneln möchte (was sicher irgendwie funktionieren könnte wenn auch nicht sonderlich gut) dann wäre dieser Tunnel für die PCI-Hardware und die Treiber völlig transparent (also aus PCI-Sicht unsichtbar), anders lassen sich Dinge wie Busmasterring oder klassische Interrupts der Geräte hinter dem Tunnel nicht realisieren.
Ich rede nicht von einem Tunnel. Ich rede von einer Bridge. Dass diese für USB->PCI extrem aufwendig ist, weil die Bussysteme physisch gesehen große Unterschiede aufweisen, steht nicht zur Debatte.
Eine recht simple Schaltung baut dir einen ISA-Bus (8-Bit) an den Parallelport. Das geht recht einfach, wenn du auf Interrupts verzichten kannst. Es wird geringfügig schwieriger, wenn du den ISA-Bus komplett nachbilden möchtest. Du kannst auch I²C-Busse problemlos an einen Parallelport, an einen USB-Anschluss oder an einen PCI-Bus hängen, all das gibt es. Und PCI-PCI-Bridges ist auch kein Thema, siehe CardBus (obwohl die physische Schicht dort trotzdem anders aussieht).
Klar benötigt dieser Tunnel eine Konfiguration aber ein HAL ist das IMHO absolut nicht (weil ja für die PCI-Geräte und PCI-Treiber alles so bleibt wie es die PCI-Spec festlegt).
Eine Abstraktion ist eine
Softwareschnittstelle, keine Hardwareschnittstelle. Dem Temperatursensor ist total egal, wie der I²C-Bus mit dem Rechner verbunden ist, er sieht nur I²C. Und PCI-Hardware sieht nur einen PCI-Bus. Logisch, sonst funktioniert die Hardware ja nicht.
Der Unterschied (mit/ohne HAL) liegt darin, ob dein Hardwaretreiber weiß, wo das Gerät angeschlossen ist, oder nicht. Und ob es prinzipiell einen Unterschied macht, ob da eine Bridge zwischen ist, oder nicht. Das ist alles.
Im Falle von USB ist es meinem Microcontroller nicht egal, ob ich einen Hub angeschlossen habe. Der kann nämlich mit Hubs nichts anfangen (und auch sonst nur exakt ein einziges Gerät verwalten, dessen Treiber ich zudem bei der Initialisierung des USB-Stacks mit angeben muss).
Und wenn du nicht "Bussystem" abstrahieren möchtest, weil dir das widerstrebt, dann ist eine Abstraktion für "USB-Bus" trotzdem ein Teil des HAL (oder ein Teil deines USB-Stacks, oder des EHCI-Treibers, Implementierungsdetail). Im Endeffekt sollte es dem Gerätetreiber egal sein, ob ein USB-Hub unterwegs auftaucht oder nicht, ob du den Anschluss gewechselt hast oder nicht oder ob das Hardwareprotokoll nun USB 1.1 oder USB 2.0 kann.
Die Summe aller solcher APIs, die jeweils ein Stückchen Hardware abstrahieren, ist der HAL.
Das trifft aber auch auf Treiber zu oder auf das OS als ganzes (aus Sicht der Applikationen).
Der HAL abstrahiert Hardware für Treiber, im Gegensatz zu den Treibern, die für das Betriebssystem abstrahieren. Und das Betriebssystem als Ganzen abstrahiert für Anwendungen.
Leg die Dinge nicht immer so aus, wie ich sie gerade nicht gemeint habe.
Der typische Benutzer sieht ein Fenster mit Word drin und der Computer ist "der graue Kasten unterm Tisch". Es geht ihm nicht darum, die Maus zu bewegen, sondern er "klickt auf den Druckerbutton und dann kommt bedrucktes Papier aus dem Drucker".
Sorry, aber das kannst Du Deiner Oma so erklären, hier sind wir auf lowlevel.eu und da ist diese Art von Erklärung IMHO weniger geeignet.
Es geht um die Sichtweise, und für gewisse Anwendungsfälle ist eine gewisse Sichtweise vorteilhaft, eine andere wiederum untauglich.
Ich glaube, wenn ich "Festplatte" sage, denkst du in erster Linie auch ein Kästchen mit SATA-/IDE-/USB-Anschluss und bist der Meinung, dass da Daten in Form von Sektoren draufgepresst werden. Das ist aus Sichtweise des Betriebssystems eine hinreichend gute Abstraktion. Da fallen übrigens auch SSDs (und im weiteren Sinne USB-Sticks oder CF-Karten) drunter.
Für Anwendungsprogramme ist eine Festplatte etwas, wo ein Pfad dransteht und Dateien drauf sind.
Für Datenrettungsunternehmen und Festplattenhersteller ist eine Festplatte etwas, was aus rotierenden, beschichteten Metallscheiben besteht, die entsprechend physischer Gesetze magnetisiert werden und den Magnetisierungszustand mit halbleitertechnologischen Mitteln rein- & rausschieben können. Für einen OS-Entwickler ist diese Sichtweise natürlich blödsinnig.
Dein Ziel ist es aber, die Anwendung zu bedienen.
Absolut richtig, trotzdem kann ich als OS-Dever nicht den langen und komplizierten Weg der Informationen vom User bis zur eigentlichen Applikation und zurück ignorieren.
Du kannst aus Sicht der Anwendungen schauen, du kannst es aber auch aus Sicht der Hardware tun. Im einen Fall ist die Hardware das Ende der Kette, im anderen Fall in der Mitte.
Man nimmt sich immer nur die Teilaspekte raus, die man gebrauchen kann, das solltest du wissen. Und für meine Betrachtung eines HAL ist mein Bild nunmal recht gut geeignet. Wenn du von einer ganz anderen Sicht auf die Dinge ausgehst, ist es ungleich schwieriger, da noch was zu sehen.
Eben genau deswegen ist es offensichtlich so enorm schwierig den HAL als Einzel-Komponente exakt zu definieren.
Der HAL ist keine Einzelkomponente, sondern er definiert das Zusammenspiel verschiedener Komponenten.
Gruß,
Svenska