2010-03-03 3 views
6

Je suis en train de porter/déboguer un pilote de périphérique (utilisé par un autre module noyau) et de faire face à une impasse parce que dma_sync_single_for_device() échoue avec un noyau oops.Où commencer à apprendre sur linux DMA/pilotes de périphériques/allocation de mémoire

Je n'ai aucune idée de ce que cette fonction est supposée faire et googler ne m'aide pas vraiment, donc j'ai probablement besoin d'en apprendre plus sur ce genre de choses au total.

La question est, par où commencer?

Oh oui, dans le cas où il est pertinent, le code est censé fonctionner sur un PowerPC (et linux est OpenWRT)

EDIT: preferrable (livres prennent des ressources en ligne quelques jours à livrer :)

+0

Pourrait aider à avoir le traceback oops (sous forme symbolique). Cela n'est pas censé se produire, comme vous l'avez probablement deviné. La raison la plus probable est qu'elle est appelée deux fois dans la même région DMA. –

+0

En fait, je pense que je vais poster une nouvelle question à ce sujet (comme le problème arrive avec 2.6.30.10, mais pas sur 2.6.23) – Kimvais

Répondre

9

en ligne:

Anatomy of the Linux slab allocator

Understanding the Linux Virtual Memory Manager

Linux Device Drivers, Third Edition

The Linux Kernel Module Programming Guide

Writing device drivers in Linux: A brief tutorial

Bo OKS:

Linux Kernel Development (2nd Edition)

Essential Linux Device Drivers (Seuls les 4 premiers - 5 chapitres)

Ressources utiles:

the Linux Cross Reference (interrogeable noyau Source pour tous décortiqués)

API changes in the 2.6 kernel series


dma_sync_single_for_device appelle dma_sync_single_range_for_cpu un peu plus haut dans le dossier et c'est la documentation source (je suppose que même si cela est pour armer l'interface et le comportement sont les mêmes):

/** 
380 * dma_sync_single_range_for_cpu 
381 * @dev: valid struct device pointer, or NULL for ISA and EISA-like devices 
382 * @handle: DMA address of buffer 
383 * @offset: offset of region to start sync 
384 * @size: size of region to sync 
385 * @dir: DMA transfer direction (same as passed to dma_map_single) 
386 * 
387 * Make physical memory consistent for a single streaming mode DMA 
388 * translation after a transfer. 
389 * 
390 * If you perform a dma_map_single() but wish to interrogate the 
391 * buffer using the cpu, yet do not wish to teardown the PCI dma 
392 * mapping, you must call this function before doing so. At the 
393 * next point you give the PCI dma address back to the card, you 
394 * must first the perform a dma_sync_for_device, and then the 
395 * device again owns the buffer. 
396 */ 
3

Les chapitres du Linux Device Drivers book (de la même série que Understanding the Linux Kernel, recommandé par @Matthew Flaschen) pourrait vous être utile.

Vous pouvez télécharger les chapitres indiivudaux à partir du LWN Website. Chapter 16 traite avec DMA.

Questions connexes