2010-03-03 15 views
6

Sto eseguendo il porting/debug di un driver di periferica (utilizzato da un altro modulo del kernel) e di fronte a un vicolo cieco perché dma_sync_single_for_device() fallisce con un kernel oops.Dove iniziare a conoscere Linux DMA/driver di periferica/allocazione di memoria

Non ho idea di cosa dovrebbe fare questa funzione e googling non è di grande aiuto, quindi probabilmente ho bisogno di saperne di più su questa roba in totale.

La domanda è, da dove cominciare?

Oh sì, nel caso in cui è rilevante, si suppone il codice per l'esecuzione su un PowerPC (e Linux è OpenWRT)

EDIT: risorse on-line preferibile (libri prendono un paio di giorni da consegnare :)

+0

Potrebbe essere utile avere il traceback oops (in forma simbolica). Questo non dovrebbe accadere, come probabilmente avete indovinato. Il motivo più probabile è che viene chiamato due volte nella stessa regione DMA. –

+0

In realtà, penso che avrò una nuova domanda su questo (poiché il problema si verifica con 2.6.30.10, ma non su 2.6.23) – Kimvais

risposta

9

on-line:

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 (Solo i primi 4 - 5 capitoli)

Risorse utili:

the Linux Cross Reference (ricercabile Kernel di origine per tutti i kernel)

API changes in the 2.6 kernel series


dma_sync_single_for_device chiama dma_sync_single_range_for_cpu un po 'più in alto nel file e questa è la documentazione di fonte (suppongo che anche se questo è per armare l'interfaccia e il comportamento sono gli stessi):

/** 
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

I capitoli del Il libro Linux Device Drivers (nella stessa serie di Understanding the Linux Kernel, raccomandato da @Matthew Flaschen) potrebbe essere utile.

È possibile scaricare i capitoli indiivudal dallo LWN Website. Chapter 16 si occupa di DMA.

Problemi correlati