problemas de dma

  

en el proyecto serán utilizados con frecuencia durante la conducción de transmisión de datos DMA, DMA memoria requerida tiene sus propias características, se considera generalmente que requieren direcciones físicas continuas, y la memoria caché no se proporciona en un núcleo de Linux El dma_alloc_coheren.md. * dev, size_t tamaño, dma_addr_t * dma_handle, gfp_t gfp) {void * ret; if (! dev | |  * DevS- > dma_mask > = 0xffffffffUL) gfp &= ~ GFP_DMA; ret = (void *) __ get_free_pages (gfp, get_order (tamaño)); //(1) si (RET) {memset (ret, 0, tamaño); * dma_handle = virt_to_bus (RET); //(2)} return ret;} (1) se convierte en una orden de tamaño, es decir, 2 ^ fin (2) a la ret bus de direcciones virtuales esta función es una dirección de internet funciones relacionadas, estos son detalles de implementación en la plataforma x86, desde aquí podemos ver que la función devuelve un valor de dirección de Linux núcleo lineal, por lo que el proceso de implementación de la función mmap facilitaron el desarrollo de controladores. Sin embargo, este no es el caso de la plataforma powerpc. He encontrado problemas al trasladar el controlador pci de la plataforma x86 a la plataforma powerpc. Primero echemos un vistazo al procesamiento de la memoria dma por las dos plataformas. 86: área de memoria DMA Linux se divide en regiones, regiones de memoria y área de memoria superior normal, el área de memoria superior se utiliza que cuando el 768M de memoria física, el área general del 16M DMA, este espacio definido por la sistema operativo pre
Quédate El área DMA y el área Normal usan mapeo lineal, que es usado por direcciones lógicas, y la memoria de gama alta usa direcciones virtuales de kernel. el espacio del núcleo es donde la división: región de aislamiento físico --8M --vmalloc alto aislamiento regiones --8k área de mapeo --4M - Un área de correspondencia fija --128kpowerpc: Esta sección utiliza el chip Freescale mpc5121, por ejemplo, el núcleo no lo hace el uso normal de la zona de memoria, y ZONE_HIMEM ZONE_DMA sólo dos tipos de espacio, bajo ZONE_DMA de almacenamiento de memoria, ZONE_HIMEN de almacenamiento de memoria superior, no toda la memoria utilizando las direcciones lógicas este concepto. Por lo tanto, las operaciones basadas en direcciones lógicas no son portátiles. La siguiente distinción específica aspecto: void * __dma_alloc_coherent (tamaño size_t, dma_addr_t * mango, gfp_t GFP) {//la página espacio de aplicación física = alloc_pages (GFP, orden); //espacio físico caché despejado {unsigned long kaddr = (unsigned long) page_address (página); memset (page_address (página), 0, tamaño); flush_dcache_range (kaddr, kaddr + tamaño);} //aplicación espacio virtual c = vm_region_alloc (&consistent_head, tamaño, gfp &~ (__ GFP_DMA |  __GFP_HIGHMEM)); //dirección virtual para la asignación de dirección física, si (c) {unsigned long vaddr = C- > vm_start; pte_t * pte = consistent_pte + CONSISTENT_OFFSET (vaddr); página struct * Final = página + (1 < < orden); split_page (página, orden); /** Establece el " asa DMA " * /* mango = page_to_bus (página); do {BUG_ON (pte_none (* pte!)); SetPageReserved (página); set_pte_at (&init_mm, vaddr, pte, mk_pte (página, pgprot_noncached (PAGE_KERNEL))); página ++; pte ++; vaddr + = PAGE_SIZE;} while (tamaño - = PAGE_SIZE); //valor de retorno del núcleo de direcciones virtuales. Devolver (void *) c- > vm_start

Copyright © Conocimiento de Windows All Rights Reserved