2017-06-30 4 views
3

Ich möchte ein FreeBSD-Kernel-Modul schreiben, das einige beliebige Interrupts akzeptiert und bei Empfang dieser Interrupts einige Daten an ein beliebiges Gerät ausgibt. Derzeit habe ich mehrere Probleme:Ein FreeBSD-Kernel-Modul schreiben, das einen beliebigen Interrupt verarbeitet und an das Gerät ausgibt

  1. Wie würde ich Interrupts durch einen bestimmten IRQ erwerben? Unter Linux gibt es den request_irq() Aufruf, aber es scheint, dass es keine ähnliche API für FreeBSD gibt ... Sagen wir, ich möchte alle Tastaturinterrupts über mein Kernelmodul erkennen können (die Tastatur befindet sich auf irq1), wie würde ich das machen? (Unter Linux ist es möglich, durch den Aufruf free_irq(1, NULL) und request_irq(1, ...), korrigieren Sie mich, wenn ich falsch liege).

  2. Ist es überhaupt möglich, über ein Kernelmodul in eine Gerätedatei unter/dev zu schreiben? Ich habe die Frage Example for reading text files in FreeBSD kernel module gelesen; Nach diesem Beispiel konnte ich reguläre Dateien lesen/schreiben, aber keine Gerätedatei unter/dev (das "Gerät" war ein Pseudo "echo device", das klassische in Char-Geräte-Beispielen). Ich konnte die Datei jedoch öffnen.
    Ich verstehe, dass es als eine schlechte Praxis gilt, Datei-I/O im Kernel zu tun, aber ich könnte nicht anders denken ... Wenn jemand eine bessere Lösung hat, bitte sagen Sie mir. (Dh mit einem Gerät durch seine device_t Knoten schreiben?)

Der Grund, warum ich dies in einem Kernel tat ist, dass ich wirklich alle Unterbrechungen müssen getroffen werden und im Benutzerraum läuft, hat das Risiko von fehlende Interrupts aufgrund von Kernel-Threads, die Benutzer-Threads vorwegnehmen (die Interrupts könnten sehr häufig auftreten).

Ich würde auch freuen, wenn mich jemand mit einigen anderen Ideen bieten konnte, wie dieses Programm zu implementieren (im Grunde ist die Idee, ein Kernel-Modul, das die Arbeit eines Mikrocontrollers tun könnte ...)

+0

Sie sind sehr mutig und mutig. – ThingyWotsit

Antwort

0

Sie können Registrieren Sie einen IRQ-Handler mit bus_setup_intr.

Normalerweise, was man in dieser Situation tun würde, ist ein Treiber die Interrupts und alle anderen nützlichen Daten zu sammeln, und es über ein Gerät zu exportieren, und dann einen (Echtzeit vielleicht?) Prozess im User-Space kann Lesen Sie von einem Gerät, tun Sie alles, was Sie tun müssen, und schreiben Sie auf das andere Gerät.

Verwandte Themen