2015年9月25日 星期五

在Uboot下遇到的DMA快取一致性問題



關於DMA快取一致性(Cache coherency)的問題以前只在書上看過,但沒想到真的讓我遇到了。事情是這樣的,我原本的目的是想在u-boot下做一些memory的測試,所以在U-boot裡加入了DMA功能,並且做成了一個u-boot Command

首先講一下DMA是什麼:
DMA的基本原理就是不需經過CPU進行memory讀寫操作,而是由DMA控制器來負責,可以把DMA想像成另一顆只負責處理memory存取的processor,當需要將一大塊memory區塊搬到另一目的位址時,使用DMA會有很好的效果,許多周邊裝置都會使用到DMA,例如GPU或網卡等。

那麼何謂DMA快取一致性(Cache coherency)?
維基如是說 :

粗略地畫一下簡圖
以下是我的環境:
Platform: Arm arch , TI DM81xx
DMA: TI EDMA control
u-boot:
來源位址: 0x84000000
目標位址: 0xA0000000 (要被DMA寫入的位址)


一開始在來源位址: 0x84000000 寫入4k大小的 pattern value ( 0x55 )

再來執行DMACopy動作

接著使用md 指令:
   可以看到從目標位址: 0xA0000000開始確實有寫入了4K大小的pattern
   DMA正常動作


但之後要寫入另一個pattern(0x33)並執行DMA Copy發現目標位址的值沒有改變,試了很多次都一樣



將目標位址全部印出之後才發現只有後半段有更新到,這時才發覺可能是快取的問題。


解決方法: 

    1. 下U-boot指令, d-cache off 可以將資料快取(Data cache)整個關掉,
         但這個方法會讓CPU的讀寫速度變得很慢
    2. 在每次要執行DMA存取前先將快取給清除掉,Uboot裡有提供flush_dcache_all
        這個函式可以把資料快取(Data cache)清除 

沒有留言:

張貼留言