Wer und wie erkennt wann, welcher Treiber benötigt wird? Um bei den Dateisystemen zu bleiben: Der ATA Treiber erkennt eine Festplatte, wie erkenne ich, ob ich eine Instanz von FAT, EFS, oder sonstwas brauche? Soll einfach jeder Treiber mal geladen und getestet werden?
Im Falle einer Festplatte brauchst du vermutlich erstmal einen Partitions-Layer, der erstmal MBR (ggf. GPT) zerpflückt. Wenn der durchgelaufen ist, dann hast du statt einer Festplatte mehrere voneinander streng zu trennende Blöcke (Partitionen), und du kennst von jeder Partition den Typen (= Dateisystem). Da die Typen nicht immer eindeutig sind (Linux-Partitionen haben alle die MBR-ID 0x83), kannst du dafür einfach eine feste Liste von Dateisystemen nacheinander ausprobieren.
Wenn diese Heuristik fehlschlägt, dann muss der Benutzer eingreifen. Einfach mal alle Dateisystemtreiber auf ein Block Device loszulassen, ist jedenfalls unelegant, weil nicht alle Dateisysteme eindeutige Headerfelder haben. Wenn ein solcher Treiber fälschlicherweise glaubt, er versteht einen Garbage-Header, zerstörst du dir u.U. Partitionen, die du nie hättest anfassen sollen. (Windows ist bekannt dafür, gewissen Linux-Partitionen einen Laufwerksbuchstaben zuzuweisen und bei einem Zugriff zu fragen, ob das komische Ding da formatiert werden soll. Passiert aber nur selten.)
Ich wollte erstmal einfach alle Treiber aus dem Verzeichnis Driver laden. Wahrscheinlich erstelle ich eine Liste pro Interface mit den zugehörigen Treibern.
Je nachdem, was du für Hardware unterstützen möchtest, musst du unterscheiden zwischen erkennbaren und nicht erkennbaren Geräten.
Erkennbare Geräte sind einfacher: Wenn du einen PCI-Bustreiber lädst, dann kann er dir sagen, welche Geräte an ihm angeschlossen sind. Diese Information (und die eindeutige ID) könntest du z.B. in eine Art "Event" verpacken und an den Kernel schicken, damit der dann den entsprechenden Treiber lädt - und zwar auch zur Laufzeit. Die meisten für dich wichtigen PC-Geräte funktionieren so, also PCI, USB, SATA, ISAPnP, Firewire usw. Wenn du das ordentlich hinbekommst, dann hast du auch die Grundlage für Hot-Plugging gelegt.
Nicht erkennbare Geräte kannst du nicht erkennen. Du kannst nur auf gut Glück einen Treiber auf eine bestimmte Hardware-Adresse laden und schauen, ob der Treiber dort seine Hardware findet. Das heißt, du brauchst irgendwo eine Liste von bekannten Standardadressen, wo du die dafür vorgesehenen Treiber einfach mal lädst und guckst, was passiert. Das betrifft alle Geräte, die entweder historisch gewachsen oder extrem simpel sind, also per ISA, I²C, SPI oder ähnlich beschränkten Bussystemen angeschlossen sind. Manche modernen Geräte kannst du wegen Kompatiblität auch so behandeln (USB-Tastatur, PCI-VGA). Beispiele sind die PS/2-, COM- und LPT-Schnittstellen, IDE-Festplatten (aber nicht unbedingt der dazugehörige IDE-Controller), viele Mainboardgeräte (z.B. Flashbausteine, Temperatursensoren), oder der DDC/EDID-Baustein in Bildschirmen.
Wenn du alle Geräte als "nicht erkennbar" behandelst - was auch gut funktioniert, zumindest für statische Geräte - dann musst du aber bedenken, dass du die Treiber in einer gewissen Reihenfolge laden musst, und dass du gewisse Treiber u.U. auch mehrfach laden musst (z.B. PCI-PCI-Bridges).
PCI Treiber durchsucht alle PCI Geräte, für jeden gefundenen DiskController erstellt er eine Instanz des zugehörigen Treibers, dieser erstellt pro angeschlossenem ATA/ATAPI Device wieder eine Instanz, diese wiederum pro Dateisystem ebenfalls eine Instanz. Aber am Ende muss es genau eine Instanz des VFS Treibers geben, der dann alle Instanzen der Dateisysteme zusammenführt.
Exakt. Entweder, alle aktiven Dateisysteme müssen sich im einzigen VFS-Treiber anmelden ("Mounten"), oder jedes Dateisystem stellt sein eigenes VFS-Interface bereit ("Laufwerksbuchstaben").