關於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
來源位址:
0x84000000
目標位址:
0xA0000000 (要被DMA寫入的位址)
一開始在來源位址:
0x84000000 寫入4k大小的 pattern
value (
0x55 )
再來執行DMA的Copy動作
接著使用md
指令:
可以看到從目標位址:
0xA0000000開始確實有寫入了4K大小的pattern,
DMA正常動作。
但之後要寫入另一個pattern(0x33)並執行DMA
Copy時,發現目標位址的值沒有改變,試了很多次都一樣。
將目標位址全部印出之後才發現只有後半段有更新到,這時才發覺可能是快取的問題。
解決方法:
1. 下U-boot指令,
d-cache
off 可以將資料快取(Data
cache)整個關掉,
但這個方法會讓CPU的讀寫速度變得很慢。
但這個方法會讓CPU的讀寫速度變得很慢。
2. 在每次要執行DMA存取前先將快取給清除掉,Uboot裡有提供flush_dcache_all
這個函式可以把資料快取(Data
cache)清除。
沒有留言:
張貼留言