2010-03-03 10 views
6

Piszę/debuguję sterownik urządzenia (który jest używany przez inny moduł jądra) i stoję w martwym punkcie, ponieważ dma_sync_single_for_device() nie działa z jądrem ups.Gdzie zacząć uczyć się o linuksie DMA/sterowniki urządzeń/alokacja pamięci

Nie mam zielonego pojęcia, co ta funkcja ma zrobić, a szukanie w Google nie bardzo pomaga, więc prawdopodobnie będę musiał dowiedzieć się więcej na ten temat.

Pytanie brzmi, od czego zacząć?

O tak, w przypadku gdy jest to stosowne, kod ma działać na PowerPC (a Linux jest OpenWRT)

EDIT: on-line zasoby preferrable (książki potrwać kilka dni mają być dostarczone :)

+0

Może pomóc mieć oops traceback (w formie symbolicznej). To nie powinno się zdarzyć, jak się pewnie domyśliliście. Najbardziej prawdopodobnym powodem jest to, że jest on wywoływany dwa razy w tym samym regionie DMA. –

+0

Właściwie myślę, że opublikuję nowe pytanie na ten temat (ponieważ problem występuje z 2.6.30.10, ale nie 2.6.23) – Kimvais

Odpowiedz

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 (tylko pierwsze 4 - 5 rozdziałów)

Przydatne zasoby:

the Linux Cross Reference (Przeszukiwalny Kernel źródło dla wszystkich jąder)

API changes in the 2.6 kernel series


dma_sync_single_for_device wzywa dma_sync_single_range_for_cpu trochę dalej w pliku i jest to dokumentacja źródła (zakładam, że choć jest to dla uzbroić interfejs i zachowanie są takie same):

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

rozdziałów Książka Linux Device Drivers (w tej samej serii, co Zrozumienie jądra Linux, zalecane przez @Matthew Flaschen) może być przydatna.

Możesz pobrać rozdziały indiivudalne z LWN Website. Chapter 16 zajmuje się DMA.

Powiązane problemy