2010-02-23 6 views
3

Je souhaite créer de la mémoire à utiliser pour les transferts DMA. (En utilisant Linux 2.6.18-128.el5 # 1 SMP)Création de mémoire physique à partir de l'espace utilisateur à utiliser pour les transferts DMA

J'ai une pile API + pilote noyau pour mon H/W qui peut le faire pour moi, mais c'est très très lent!

Si j'utilise l'API pour créer un transfert DMA, il alloue de la mémoire très haut dans la RAM système (par exemple 0x7373a6f8 en une fois). (J'ai l'ICD de l'appareil, donc j'ai une carte de mémoire mmap'd, c'est comme ça que je peux trouver cette adresse, et comment à la fin je veux mettre à ma propre adresse, et donc le/dev/mem dans les cartes ci-dessous)

Je ne peux pas sembler capable de mmap la mémoire autour de cette adresse élevée, vraisemblablement comme étant hors de mon espace de mémoire virtuelle et im étant bloqué par le noyau? Ce que je veux être en mesure de faire est soit d'utiliser (mapper) cette adresse donnée, donc je peux lire/écrire, OU créer ma propre mémoire physique que je peux lire/écrire.

# cat /proc/iomem 
00000000-0009fbff : System RAM 
    00000000-00000000 : Crash kernel 
000a0000-000bffff : Video RAM area 
000c0000-000c7fff : Video ROM 
000f0000-000fffff : System ROM 
00100000-7fd64fff : System RAM  # Is this all of /dev/mem? 
    00400000-00612916 : Kernel code 
    00612917-006ef9db : Kernel data 

# cat /proc/3450/maps 
08207000-08228000 rw-p 08207000 00:00 0   [heap] 
b7e7b000-b7f85000 rw-p b7e7b000 00:00 0 
b7f89000-b7f8a000 rw-p b7f89000 00:00 0 
b7f8a000-b7f8b000 rw-s 80114000 00:11 1541  /dev/mem 
b7f8b000-b7f8d000 rw-p b7f8b000 00:00 0 
bff70000-bff85000 rw-p bffea000 00:00 0   [stack] 
+0

Si je suis bien, vous avez un comprendre pilote de périphérique qui se comporte mal, et vous essayez de travailler autour de ce en allouant manuellement RAM physique de l'espace utilisateur? Y a-t-il une raison pour laquelle vous n'êtes pas intéressé à réparer le pilote à la place? Cela ressemble à une demande très étrange, pas quelque chose qui serait considéré comme une solution appropriée par la plupart des gens. Je suppose que vous auriez plus d'aide si vous travailliez sur le problème de pilote sous-jacent. –

+1

Votre droite, l'API/bibliothèque de l'espace utilisateur est sllooow. Bien que je sois un développeur expérimenté en C/C++, je n'ai jamais fait de sécheurs de périphériques auparavant, et c'est maintenant mon domaine ou celui de mon entreprise. J'étais après/espérant un hack rapide (lire sale) pour contourner cela comme vous avez travaillé, mais c'est vraiment maintenant à notre fournisseur de pilote API/noyau de nous fournir un meilleur pilote! Merci pour votre réponse! –

+0

@Eric Si vous voulez mettre ces mots comme une réponse, je vais l'accepter, car même si nous n'utilisons pas DMA maintenant, je suis en train d'implémenter notre propre pilote de périphérique (http://stackoverflow.com/q/5185397/119790) –

Répondre

0

Si je vous comprends bien, vous avez un pilote de périphérique qui se comporte mal, et vous essayez de travailler autour de ce en allouant manuellement RAM physique de l'espace utilisateur? Y a-t-il une raison pour laquelle vous n'êtes pas intéressé à réparer le pilote à la place?

Cela ressemble à une requête très étrange, pas quelque chose qui serait considéré comme une solution appropriée par la plupart des gens. Je suppose que vous auriez plus d'aide si vous travailliez sur le problème de pilote sous-jacent.

(copié de commentaire ci-dessus.)

+1

J'ai déclaré que j'accepterais ce commentaire précédemment fait (voir ci-dessus) donc j'ai, comme c'est maintenant ce que j'ai fait! Mais je dois avoir un petit gémissement au sujet du point de vue exprimé, bien que correct, cela n'enlève rien au fait de ne pas vraiment aider la réponse à la question! Un grand merci cependant comme toujours à toutes les entrées/anyones ... –

+0

Une critique juste; peut-être que j'aurais dû en faire un commentaire au lieu d'une réponse :) –

Questions connexes