dma

  
からの問題Dma転送データはプロジェクトドライバプロセスでよく使用され、dmaに必要なメモリには固有の特性があり、一般に物理アドレスは連続している必要があり、メモリはキャッシュ可能ではなく、Linuxカーネルに用意されています。 dma_alloc_coheren.md * dev、size_tのサイズ、dma_addr_t * dma_handle、gfp_t gfp){void * ret; if(!dev | int} |  * dev-> dma_mask> = 0xffffffffUL)gfp& =〜GFP_DMA; ret =(void *)__ get_free_pages(gfp、get_order(size)); //(1)if(ret){memset(ret、0、) Size); * dma_handle = virt_to_bus(ret); //(2)return ret;}(1)サイズをオーダーに変換、すなわち2 ^ order(2)仮想アドレスの変換retをバスアドレスに変換この関数はプラットフォームです。関連する関数、上記はx86プラットフォームの実装の詳細です。ここから、この関数の戻り値がLinuxカーネルの線形アドレスであることがわかります。したがって、ドライバ開発プロセスのmmap関数の実装には便利です。しかし、これはpowerpcプラットフォームの場合ではなく、pciドライバをx86プラットフォームからpowerpcプラットフォームに移植する際に問題が発生しました。まず、2つのプラットフォームによるdmaメモリの処理を見てみましょう。 X86:Linuxのメモリ領域はDMA領域、ノーマルメモリ領域、ハイエンドメモリ領域に分けられ、ハイエンドメモリ領域は物理メモリが768M以上の場合に使用され、一般DMA領域は16Mで、この領域は OSによって事前処理されます。とどまる。 DMA領域と通常領域はすべて論理アドレスで使用されるリニアマッピングを使用し、ハイエンドメモリはカーネル仮想アドレスを使用します。カーネル空間のパーティションは以下のとおりです。物理領域 - 8M分離 - vmalloc領域 - 8K分離 - -4Mハイエンドマッピング領域 - 固定マッピング領域 - 128kpowerpc:このセクションでは例としてfreescaleのmpc5121チップを使用しますが、カーネルは使用しません。通常メモリ領域が使用され、ZONE_DMAとZONE_HIMEMのみが使用され、そのうちZONE_DMAはローエンドメモリを格納し、ZONE_HIMENはハイエンドメモリを格納し、メモリ全体は論理アドレスの概念を採用しません。そのため、論理アドレスベースの操作は移植性がありません。具体的な違いを見てみましょう:void * __dma_alloc_coherent(size_t size、dma_addr_t * handle、gfp_t gfp){//物理空間ページのページpage = alloc_pages(gfp、order); //物理空間キャッシュをクリアする{unsigned long Kaddr =(unsigned long)page_address(page); memset(page_address(page)、0、size); flush_dcache_range(kaddr、kaddr + size);} //仮想スペースを要求するc = vm_region_alloc(& consistent_head、size、gfp& A);〜(__ GFP_DMA |  __GFP_HIGHMEM)); //次の場合は仮想アドレスと物理アドレスのマッピングを実装する。(c){unsigned long vaddr = c-> vm_start; pte_t * pte = consistent_pte + CONSISTENT_OFFSET(vaddr); struct page * end = page +(1< < order); split_page(page、order); /**「dma handle」を設定する* /* handle = page_to_bus(page); do {BUG_ON(!pte_none(* pte)); SetPageReserved(page); set_pte_at (&init_mm、vaddr、pte、mk_pte(page、pgprot_noncached(PAGE_KERNEL))); page ++; pte ++; vaddr + = PAGE_SIZE;} while(size - = PAGE_SIZE); //戻り値はカーネルの仮想アドレスです。 (void *)c-> vm_startを返します。
Copyright © Windowsの知識 All Rights Reserved