Ecrire un module du kernel FreeBSD qui gère les interruptions arbitraires et les sorties vers les périphériques

Je voudrais écrire un module de kernel FreeBSD qui pourrait accepter des interruptions arbitraires et, à la réception de ces interruptions, émettre des données vers un périphérique arbitraire. Actuellement, je suis confronté à plusieurs problèmes:

  1. Comment pourrais-je acquérir des interruptions via une IRQ spécifique? Sur Linux, il y a l’appel à request_irq() mais il semble qu’il n’y ait pas d’API similaire pour FreeBSD … Disons que je veux être capable de détecter toutes les interruptions de clavier via le module kernel (le clavier est sur irq1). cette? (Sous Linux, il est possible d’appeler free_irq(1, NULL) et request_irq(1, ...) , corrigez-moi si je me trompe).

  2. Est-il possible d’écrire dans un fichier de périphérique sous / dev via un module de kernel? J’ai lu la question Exemple de lecture de fichiers texte dans le module kernel FreeBSD ; En suivant cet exemple, j’ai pu faire des lectures / écritures sur des fichiers réguliers, mais pas un fichier de périphérique sous / dev (le “device” était un pseudo “echo device” , le classique utilisé dans les exemples de périphériques). J’ai pu ouvrir le fichier cependant.
    Je comprends que cela soit considéré comme une mauvaise pratique de faire des E / S de fichiers dans le kernel, mais je ne pouvais pas penser à autre chose … Si quelqu’un a une meilleure solution, veuillez me le dire. (c.-à-d. écrire sur un périphérique via son noeud device_t ?)

La raison pour laquelle je faisais cela dans un kernel est que je dois vraiment toucher toutes les interruptions, et l’exécuter dans l’espace utilisateur risque de manquer les interruptions dues aux threads du kernel préemptant les threads utilisateur (les interruptions peuvent être très fréquentes).

J’apprécierais aussi si quelqu’un pouvait me donner d’autres idées sur la manière d’implémenter ce programme (en gros, l’idée est un module de kernel qui pourrait faire le travail d’un microcontrôleur …)

Vous pouvez enregistrer un gestionnaire IRQ avec bus_setup_intr .

Normalement, ce que l’on ferait dans cette situation est de demander à un pilote de collecter les interruptions et toute autre donnée utile, et de l’exporter via un périphérique, puis un processus (temps réel peut-être?) , faites ce qu’il doit faire et écrivez sur l’autre appareil.