2009-11-19 13 views
2

En raison de certaines exigences sur la vitesse, nous avons besoin de quelques calculs en place sur la mémoire interne puis DMA les résultats du calcul vers une mémoire externe. L'application fonctionne sur un processeur TI DM355 qui est basé sur le noyau ARM926EJ-S et un ensemble de TI periferals (EDMA, accélérateurs vidéo, etc.).accéder à la mémoire interne de l'ARM à partir d'un processus utilisateur sur GNU/Linux

À quel point cela peut-il être fait correctement à partir de l'application? Est-ce aussi simple que de placer l'adresse mémoire interne susmentionnée dans un espace virtuel et de faire le calcul?

Merci

+0

Je dirais que cela pourrait être difficile ... Linux autorisera-t-il même un tel contrôle explicite de mmap? Je pense au pire, vous devrez peut-être vous mouiller les pieds et écrire un module noyau. – Earlz

Répondre

3

Vous pouvez mmapper le/dev/mem:

int mem_fd = open("/dev/mem", O_RDWR); 
void *buffer = mmap(NULL, mem_segment_length, PROT_READ | PROT_WRITE, MAP_SHARED, 
        mem_fd, mem_segment_addr); 
close(mem_fd); 
/* buffer now points to your device's memory */ 
/* remember to call msync after writing to this to force changes to write back to 
* /dev/mem */ 

Toutefois, en fonction de vos besoins, cela peut ne pas être suffisant. Another question ici a des réponses qui vont plus en profondeur, mais vous feriez probablement mieux de le faire dans un module du noyau.

+1

Correct, sauf que msync n'est pas nécessaire dans ce cas particulier (car le "fichier" de sauvegarde n'est pas du tout un fichier). Je ne vais pas blesser. – caf

+0

Aaah-bon point! Je ne savais pas à quel point le chemin vers la mémoire était direct. – LnxPrgr3

+0

Merci beaucoup. Je vais essayer de sortir. –

0

je penserais que cela nécessiterait le niveau de sone du noyau et/ou le soutien du conducteur. Si vous utilisez une distribution Linux spécifique à votre plate-forme, il se peut que quelque chose soit déjà fourni. Vérifiez la documentation ou l'exemple de code que vous pourriez avoir.

J'ai trouvé un article sur la façon de faire réellement la mise en correspondance ici:

http://www.simtec.co.uk/appnotes/AN0014/

c'est d'accès aux registres GPIO, mais le code doit être la même pour la mémoire sur puce, avec un autre adresse. Bien sûr, si quelque chose d'autre utilise déjà cet espace, vous allez planter si vous le mappez simplement et commencez à le modifier, donc plus de recherche de documentation est probablement nécessaire. Avez-vous une carte mémoire du noyau pour votre système?

+0

Merci. J'utilise un rootfs et un noyau personnalisés. Je vais essayer mmap. Merci pour le lien. J'en ai une meilleure compréhension maintenant. –

0

Aussi, je me souviens qu'il est possible d'épingler une page en mémoire. Corrigez-moi si je me trompe.