作者hirofumisyo (Ami)
看板LinuxDev
標題[問題] 如何關掉/打開 arm cpu 快取記憶體
時間Thu Apr 2 16:43:16 2020
大家好,
我的作業平台是FPGA zynq 開發板,裡面有arm cpu。
最近在試用dma將寫進DDR的資料搬出來,
但發現搬出來的資料都有問題。
後來發現在dma開始搬資料前使用sdk開發平台的date cache disable這個功能就能讓
結果是正常的。
不過我之後希望將這個流程搬到灌了linux作業系統的環境下去執行,
因此想要問一下在linux開發環境下要如何去關掉跟打開快取呢?
我是用ubuntu的linux,
謝謝大家。
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.161.58.88 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/LinuxDev/M.1585817001.A.3E3.html
1F:→ descent: dma 要記憶體的 function 可以配置non cacahe/non buffer04/02 22:43
2F:→ descent: 的區域04/02 22:44
我的dma funciton在linux下面不能用,然後我是直接寫dma的register來啟動dma。
所以我才想要知道如果開/關cache呢?
※ 編輯: hirofumisyo (111.251.48.187 臺灣), 04/04/2020 16:57:01
3F:推 soso7885: 關了可能linux都跑不起來吧,dma w完flush cache一下呢04/04 21:17
請問在linix下怎麼flush cache呢?
※ 編輯: hirofumisyo (101.136.141.77 臺灣), 04/04/2020 22:54:55
4F:→ hizuki: linux dma coherent 了解下,劃dma區段可用cma實現,如許 04/05 13:32
5F:→ hizuki: 詳細答覆我回頭寫給你 04/05 13:32
感謝回應,我找了一些dma coherent的資料來看後,我的理解是CPU在讀寫DDR時不是直接
讀寫DDR,而是透過cache; 但DMA卻是直接搬運DDR的資料,所以才會產生搬的data跟從
CPU寫入的不一樣。我不太懂你提到的用cma劃dma區段是什麼意思,在我使用的FPGA手冊
有給出DDR對應到的memory address range,因此我使用mmap的方法將data寫到對應的
address上(共4MB)。
※ 編輯: hirofumisyo (111.251.48.187 臺灣), 04/05/2020 20:35:13
6F:→ WPC001: flush_tlb_mm() / flush_tlb_range() /update_mmu_cache() 04/06 22:38
7F:→ WPC001: 有空自己看一下... 04/06 22:38
8F:→ leolarrel: 參考 volatile 關鍵字 04/07 16:07