2010-06-19 4 views
0

J'ai deux périphériques qui sont interfacés avec PCI. J'ai aussi du code pour les deux appareils qui utilise un code de socket générique. (Les périphériques étaient à l'origine connectés par MII/Ethernet.)Interfacer le code de socket avec un pilote PCI Linux

Maintenant, j'ai besoin d'écrire un pilote de périphérique PCI pour transporter les paquets entre les deux périphériques.

Comment accéder aux descripteurs de fichiers ouverts par le code de socket? Est-ce la même chose que d'accéder à un fichier de périphérique de caractères?

Le pilote PCI doit en quelque sorte capturer les paquets de read() et write() dans le code.

Merci!

Répondre

0

Les réponses à vos questions sont: (1) Vous n'avez pas, et (2) non.

Les descripteurs de fichiers sont un concept d'espace utilisateur et les pilotes de noyau n'interagissent pas avec les concepts d'espace utilisateur. (Oui, ils sont implémentés par le noyau, mais les autres pilotes de périphériques ne peuvent pas jouer directement avec eux, et ne devraient même pas jouer avec eux indirectement.)

Ce que vous faites est de mettre en œuvre des méthodes qui recevront des données qui est mis en mémoire tampon dans un espace mémoire accessible par le noyau, et l'envoie à votre matériel, puis reçoit les données de votre matériel et les écrit (lorsque demandé) dans un tampon dans la mémoire accessible par le noyau. Pour ce faire, vous devez implémenter les API de pilote de périphérique de caractères ainsi que les API de pilote de périphérique PCI, puis enregistrer votre pilote en tant que périphérique PCI, puis un périphérique de caractères. Bien que certaines de ces méthodes puissent faire référence à des structures de fichiers, elles ne seront pas les structures utilisateur-terrain que vous connaissez et aimez.

Pour les périphériques qui implémentent les protocoles Ethernet, la vie est plus facile car vous implémentez l'interface de périphérique réseau à la place. De cette façon, tout ce que vous avez à écrire est les parties nécessaires pour obtenir des données vers et depuis votre matériel.

Ce dont vous aurez besoin, ce sont les spécifications du matériel de l'appareil, la façon dont vous contrôlez le matériel en utilisant les registres et les régions PCI. La bonne nouvelle est que vous n'avez pas à faire cela seul - il y a une grande communauté de développeurs de noyau, et plusieurs bons livres (en cours) sur le développement du noyau Linux (voir ci-dessous).

Références

+0

Merci pour la réponse rapide! Voyons si je comprends ce que vous avez écrit .. Je vais devoir écrire un pilote PCI pour le périphérique cible. Le pilote va également allouer une interface Ethernet avec toutes les fonctions TX/RX. Maintenant, j'ouvre une socket et c'est là que je suis confus. Avez-vous des informations sur "lier"/"lier" un socket créé à un périphérique PCI Ethernet spécifique? Il existe un autre périphérique ethernet PCI que je ne veux pas transmettre. – StuffedB

+0

Pour que votre appareil apparaisse comme une interface réseau possible, vous devez charger le pilote en mémoire. Le pilote enregistrera les ID PCI correspondant à votre appareil.Après cela, vous devrez configurer votre pilote avec une adresse réseau (similaire au mappage d'une adresse IP à eth0). À ce stade, il s'agit, à toutes fins utiles, d'une carte réseau et est traitée comme telle par le système d'exploitation. –

Questions connexes