2015-12-27 5 views
5

Ich habe einen benutzerdefinierten Treiber, den ich geschrieben habe, soll eine benutzerdefinierte Zuordnung von genauen Hardware RAM-Speicheradressen in Benutzerland erleichtern. Ich versuche zu testen, dass gemeinsamer Speicher mmap'd wie zwischen zwei Prozessen auf die gleiche Hardware-Adresse geteilt wird ermöglicht sichtbare Speichervorgänge, die jede Seite sehen kann.Warum ist mein Schreibzugriff auf den virtuellen Speicher in Virtual Device Driver nicht sichtbar?

Mein Code ist ungefähr so ​​etwas wie dieses:

//placement: in a mmap callback to a file_operations facilitated 
    // character device 
    //phys_addr - a variable that I will ioremap for a virtual addr 
    virtaddr = ioremap(phys_addr, size); 
    if (!virtaddr) { 
    printk(KERN_INFO "could not remap page!"); 
    goto out; 
    } else { 
    printk(KERN_INFO "attempting write"); 
    *((int *)virtaddr) = 0xdeadbeef; 
    //wmb(); <--- I haven't tried this yet 
    } 

Wie es so stellt sich heraus, ich dachte, vielleicht das Problem das Fehlen einer Schreibsperre war, den Cache zu zwingen, zu rammen zu spülen. Ich muss den Test auf einige spezielle Hardware aufgrund von Betriebssystemspezifikationen starten, die außerhalb des Bereichs dieser Frage liegen. Ich denke nicht, dass Schreibbarrieren für den Hauptspeicher oder den RAM gelten, ganz so wie es für Geräteregister oder Gerätespeicher gilt (zB: Cache auf einer SSD oder so). Also, ich habe Wmb nicht getestet, aber ich wollte nur meine Frage da draußen bekommen. Ich habe auch einige durch das Linux Device Drivers 3 Buch gesucht, und ich habe meinen Code ausgeführt; Das Fragment, von dem ich ziehe ist in der Tat Ausführung und ich weiß es, weil ich die printk sehen kann. Der Treiber führt den Code aus, scheint dann aber weiter zu laufen. Schließlich gibt es ein analoges Stück Code, das auf ioremap auf einem gewöhnlichen Hardwarespeicher ausgeführt wird, von dem dann versucht wird, zu lesen. Dieser Lese enthält nicht den Wert, den ich ihm geschrieben habe.

Warum?

+2

Ich glaube nicht, dass du es so machen sollst. Zum Beispiel finde ich "Denken Sie daran, dass die von ioremap zurückgegebenen Adressen nicht direkt dereferenziert werden sollten; stattdessen sollten die vom Kernel bereitgestellten Zugriffsfunktionen verwendet werden" in der Diskussion der Gerätetreiber über [makelinux.net] (http: //www.makelinux.net) : //www.makelinux.net/ldd3/chp-9-sect-4). Wenn diese Site zu glauben ist, sollten Sie 'iowrite32()' verwenden, um den bestimmten Schreibzugriff auf E/A-Speicher auszuführen, den Sie in Ihrer Frage angeben. –

+0

Ok! Danke, ich habe diesen Teil verpasst und wahrscheinlich etwas beschädigt. Ich werde es morgen versuchen, und wenn es funktioniert, werde ich Sie einfach bitten, Ihre Antwort in die Antwortbox zu legen, damit ich sie annehmen kann. –

+0

Ich sollte iowrite32 verwenden ... aber es ist nur RAM, dass ich schreibe. Soll ich die iowrite-Familie verwenden, weil die tatsächlich zurückgegebene virtuelle Adresse keine tatsächliche dereferenzierbare Entität ist, sondern stattdessen ein Schlüssel in die Seitentabelle ist, in der der Schreibvorgang stattfinden soll? –

Antwort

1

Können Sie bitte genau sagen, was Sie mit dieser Aussage "Hardware RAM-Speicheradressen in Benutzerland" meinen.

Welche Art von Gerät, das Sie simulieren [PCIe, USB etc]

Dies alles auf Ihrem CPU-Routing abhängig ist und als Hardware nicht dann verbunden ist die Übersetzung nicht Fehler verursacht stattdessen wird es Daten über die Bus-Protokoll sendet die wird genau wie gefälschte gepackte Generation von Bus-Controller zu Gerät.

Um zu überprüfen, können Sie Bustransaktionen überprüfen und im Falle von IO-Port-Mapping können Sie überprüfen, Signale von bestimmten Port-Adresse/Bits zu verwenden.

+1

Ah Ich habe das gerade erst gesehen. Nun, zu der Zeit bei der Arbeit (vor Monaten) arbeitete ich an einem Separation Kernel und eines der Features ist in der Lage, spezifische Speicherzonen zu reservieren, die genauen Adressen entsprechen. Ich habe einen angepassten/dev/kernel-Treiber verwendet, und daher hatte ich kein Gerät, das ich simulierte. | Alles hängt davon ab ... Nein, es ist, weil ich nicht alles wegen Arbeitskomplikationen sagen kann und die Tatsache, dass es ein hochspezialisiertes Kernel-Kernel-Kernel-Modul ist. Ich weiß, dass ich dieses Problem gelöst habe, aber ich erinnere mich nicht, was genau ich tat. Wenn ich mich erinnere, werde ich es hinzufügen. –

Verwandte Themen