Bei PCI Geräten sollten fixe Adressen eigentlich Vergangenheit sein.
Bei PCI-Geräten.
Ich meinte an der Stelle, dass, wenn jede physische zweite Speicherseite belegt ist - aus welchen Gründen auch immer - der User halt mal ein paar Anwendungen schließen muss.
Genau da wiederspreche ich dir Es kann doch nicht sein, das wenn ich 1GB RAM frei habe, dass ich ne Meldung bekomme "nicht genügend Speicher". Da läuft dann wirklich was schief!
Ich will dich sehen, wie du es in
einer Anwendung (nicht Treiber!) hinkriegst, jede zweite
physische Speicherseite zu belegen. Im virtuellen Adressraum spielt das schließlich überhaupt keine Rolle.
Also um es festzuhalten, zusammenhängenden physischen Speicher braucht man nicht unbedingt.
Wenn du damit zufrieden bist, dass du damit keine DMA-Zugriffe jenseits der 4K mehr garantieren kannst, dann stimmt das. Ich behaupte, es gibt Hardware, die größere DMA-Zugriffe braucht. (Und sei es die Netzwerkkarte, die einen 8K Jumbo-Frame wegspeichern will.)
Aber du magst mir nicht glauben.
Wenn du von festen Adressen ausgehst, die der Treiber entweder durch ausprobieren rausbekommt oder die man beim Kompilieren festgelegt hat, was bringt dir das?
Es gibt nunmal Geräte mit festen Adressen. Dazu gehören ISA-Geräte, aber auch CPU-interne Geräte. Fertig.
Als Bsp. mal die ganzen ARM-Boards, es ist immer die selbe CPU und viele zusätzliche Geräte sind auch gleich, aber die MMIO Adressen sind anders, d.h. bei Linux, für jedes Board muss der Kernel/Treiber neu komiliert werden, nur weil ein paar andere Geräte und ein paar andere Adressen vorhanden sind?! Was bitte soll das, das ist in meinen Augen unfug und alles anders als modern!
Wenn man jetzt die ganzen Bussysteme abstrahiert (und ich sehe MMIOs nunmal als Bussystem), dann kannst du das auch komplett dynamisch machen. Der Kernel bootet, sieht "oh, ich laufe auf einem Quanta IL1, also finde ich ab Adresse 0xblubber die GPIOs für das WLAN" und bindest das halt dynamisch an den Treiber an.
Was du prinzipiell vergisst, ist, dass du bei Geräten mit Spezialzweck (z.B. Navis) nur eine Serie hast, die du zuschneiden kannst. Das Problem ist bei MIPS noch viel schlimmer, aber grundsätzlich musst du manchmal proben (oder dich auf Tabellen verlassen), eben weil
nicht jedes Bussystem auch einen Devicetree erzeugen kann!
Ich habe meinen Device-Server auch im Hinblick auf solche ARM-Boards geplant, nämlich das der Treiber die Ressourcen zugewiesen bekommt.
Ist ja auch vernünftig, zumindest für den Teil, der ohnehin fix (z.B. vom Bussystem her) ist.
Der Buffer für Netzwerkkarten ist jedoch dem System nicht unbedingt bekannt und/oder unterliegt Restriktionen der Hardware und/oder kann bei mehr RAM größer & effizienter gestaltet werden. Diese Entscheidung kann dein Device-Server nicht für jede Hardware optimal treffen, da er ja die Hardware nicht kennt. Er kennt höchstens das, was das Bussystem weiß.
Der Treiber weiß mehr. Und kann die Hardware an irgendwelche Begrenzungen anpassen.
Was ich damit erreichen möchte ist, dass du für jedes neue Board nicht den Kernel oder den Treiber neu kompilieren musst, sondern das du einfach nur ein Skript änderst wo alle Geräte und Adressen (für das jeweilige Board) drin stehen.
Also abstrahierst du das Bussystem. Einfache Systeme kennen keine Devicetrees, also musst du in der Lage sein, einen Treiber auch nachträglich zu laden - und ihm mitzugeben, wo er das Gerät findet. Solche Geräte, die nicht bereits initialisiert wurden (das betrifft beim PC z.B. auch sekundäre Grafikkarten, die nicht gebootet wurden!), müssen vom Treiber initialisiert werden - nicht vom Device-Server - und das betrifft insbesondere auch die Datenkommunikation mit dem Gerät.
So kann ich einfach mein OS nehmen, ohne es neu kompilieren zu müssen und kann durch ne kleine Änderung an einem Skript mein OS auf nem neuen Board lauffähig machen. Das nenn ich vernünftig, modern und im Hinblick auf andere Architekturen entwickelt!
Guck dir mal NetBSD an. Dort kannst du sämtliche Ressourcen im Bootloader angeben, sofern sie fix sind, und alles, was sich dynamisch ermitteln lässt, wird ermittelt. Und man kann dynamisch Geräte an Busse binden.
Warum ich mit Linux vergleiche, ist, dass ich Linux teilweise auf anderen Architekturen begutachte, wenn auch nicht viel, und weil Linux nunmal mehr Embedded-Bussysteme abstrahiert, wenn auch bei weitem nicht so schön wie NetBSD. Letztere kommen einfach nicht hinterher, so meine Einschätzung.
Aber ich schreibe wahrscheinlich eh gegen ne Wand.
Gruß