J'essaie de comprendre comment PCI Express fonctionne pour que je puisse écrire un pilote Windows qui peut lire et écrire sur un périphérique PCI Express personnalisé sans mémoire intégrée.
Je comprends que les registres d'adresses de base (BAR) dans l'espace de configuration PCIE contiennent l'adresse mémoire à laquelle le PCI Express doit répondre/est autorisé à écrire. (Est-ce bien compris?)
Mes questions sont les suivantes:
J'apprécie votre temps.
Meilleures salutations,
D'après votre requête, il est clair que vous souhaitez écrire un pilote pour un périphérique esclave PCIe. Pour comprendre le schéma des choses qui se produisent derrière le transfert PCIe, beaucoup de choses sont disponibles sur Internet (comme l'énumération du bus PCIe, le mappage d'adresses périphériques vers la mémoire, etc.).
Oui, votre compréhension est correcte en ce qui concerne le mappage des registres PCIe à la mémoire et vous pouvez les lire/écrire (par exemple, dans le cas d'un pilote de périphérique PCIe Linux, vous pouvez le faire en utilisant "ioremap").
Un bus d'adresse est utilisé pour spécifier une adresse physique. Lorsqu'un processeur ou un périphérique compatible DMA doit lire ou écrire dans un emplacement mémoire, il spécifie cet emplacement mémoire sur le bus d'adresse. Rien de plus à ajouter à cela. La rubrique "Énumération du bus PCIe" répondra à votre 2e question.
Votre troisième question est vague. Vous voulez dire un périphérique PCIe esclave. En supposant que oui, vous pouvez transférer des données entre un périphérique PCIe esclave et un hôte à l'aide d'un contrôleur DMA. Je travaille sur un projet impliquant "PCIe-DMA" connecté à l'hôte via le PCIe Cela dépend vraiment de votre conception et de votre implémentation. Dans mon cas, PCIe-DMA est lui-même un périphérique PCIe esclave sur la carte cible connectée à l'hôte via PCIe.
je travaille également sur le pilote de périphérique (quoique sous linux) avec une carte personnalisée. Voici ma tentative pour répondre à vos questions:
Les BAR représentent des fenêtres de mémoire vues par le système hôte (CPU) pour communiquer avec le périphérique. Le périphérique n'écrit pas dans cette fenêtre mais répond simplement aux demandes TLP (Transaction Layer Packets) (MRd *, MWr *).
Je dirais des adresses "spécifiques au bus" = "physiques" si votre architecture n'a pas de mécanisme de traduction de la couche bus. Vérifiez ce fil pour plus d'informations.
Dans tous les PC grand public x86 que j'ai utilisés jusqu'à présent, l'adresse BAR semblait être allouée soit par le BIOS, soit au démarrage du système d'exploitation. Le pilote doit travailler avec l'adresse qui lui a été attribuée.
Le terme DMA semble être utilisé abusivement au lieu de la maîtrise du bus qui, je crois, est le terme correct en PCIe. En PCIe, chaque périphérique peut être un maître de bus (si cela est autorisé dans son bit de registre de commande) 2 ) .Il le fait en envoyant des TLP MRd, MWr à d'autres appareils du bus (mais généralement à la mémoire système) et en signalant les interruptions au CPU.
la clarification de vos doutes/questions est ici.
1> Il existe de nombreux périphériques qui se trouvent sur BUS comme PCI, qui voient Memeory en termes différents d'une adresse physique, ceux-ci sont appelés adresses de bus. Par exemple, si vous lancez DMA depuis un périphérique assis sur le bus vers la mémoire principale du système, l'adresse de destination doit être l'adresse de bus correspondante de la même adresse physique dans Memmory
2> BARS est renseigné au moment de l'énumération, dans un PC typique, c'est au moment du démarrage lorsque votre frimware compatible PCI énumère les périphériques PCI présents sur l'emplacement et alloue les adresses et la taille aux BARS.
3> oui, vous pouvez utiliser les deux opérations DMA initiées ou initiées par le processeur sur ces BARRES.
-- voler haut