當前位置:首頁 » 文件管理 » dma緩存

dma緩存

發布時間: 2022-09-07 05:53:06

❶ 為什麼沒有填滿DMA緩沖區數據就進入DMA中斷

在《深入理解Linux內核》中的第545頁介紹了DMA的相關操作。說道DMA,那就不得不提到Cache(高速緩存)的問題。書中引用了如下一段例子來描述了Cache一致性問題: 「假設設備驅動程序把一些數據填充到內存緩沖區中,然後立刻命令硬體設備利用DMA傳

❷ STM32 DMA緩存多大

DMA直接存儲訪問,不限緩存大小,主要根據外設的寄存器大小而言,因為內部RAM比較大的,只是使用其一小部分而已! DMA傳輸的數據量可編程,最大可傳輸數據的數目為65535.
例如:ADC1使用DMA功能,采樣結果寄存器的大小即等於使用RAM緩存的大小。
這么久了,還請採納

❸ Android 重學系列 ion驅動源碼淺析

上一篇文章,在解析初始化GraphicBuffer中,遇到一個ion驅動,對圖元進行管理。首先看看ion是怎麼使用的:

我們按照這個流程分析ion的源碼。

如果對ion使用感興趣,可以去這篇文章下面看 https://blog.csdn.net/hexiaolong2009/article/details/102596744

本文基於Android的Linux內核版本3.1.8

遇到什麼問題歡迎來本文討論 https://www.jianshu.com/p/5fe57566691f

什麼是ion?如果是音視頻,Camera的工程師會對這個驅動比較熟悉。最早的GPU和其他驅動協作申請一塊內存進行繪制是使用比較粗暴的共享內存。在Android系統中使用的是匿名內存。最早由三星實現了一個Display和Camera共享內存的問題,曾經在Linux社區掀起過一段時間。之後各路大牛不斷的改進之下,就成為了dma_buf驅動。並在 Linux-3.3 主線版本合入主線。現在已經廣泛的運用到各大多媒體開發中。

首先介紹dma_buf的2個角色,importer和exporter。importer是dma_buf驅動中的圖元消費者,exporter是dma_buf驅動中的圖元生產者。

這里借用大佬的圖片:

ion是基於dma_buf設計完成的。經過閱讀源碼,其實不少思路和Android的匿名內存有點相似。閱讀本文之前就算不知道dma_buf的設計思想也沒關系,我不會仔細到每一行,我會注重其在gralloc服務中的申請流程,看看ion是如何管理共享內存,為什麼要拋棄ashmem。

我們先來看看ion的file_operation:

只有一個open和ioctl函數。但是沒有mmap映射。因此mmap映射的時候一定其他對象在工作。

我們關注顯卡英偉達的初始化模塊。
文件:/ drivers / staging / android / ion / tegra / tegra_ion.c

mole_platform_driver實際上就是我之前經常提到過的mole_init的一個宏,多了一個register注冊到對應名字的平台中的步驟。在這裡面注冊了一個probe方法指針,probe指向的tegra_ion_probe是載入內核模塊注冊的時候調用。

先來看看對應的結構體:

再來看看對應ion內的堆結構體:

完成的事情如下幾個步驟:

我們不關注debug模式。其實整個就是我們分析了很多次的方法。把這個對象注冊miscdevice中。等到insmod就會把整個整個內核模塊從dev_t的map中關聯出來。

我們來看看這個驅動結構體:

文件:/ drivers / staging / android / ion / ion_heap.c

這里有四個不同堆會申請出來,我們主要來看看默認的ION_HEAP_TYPE_SYSTEM對應的heap流程。

其實真正象徵ion的內存堆是下面這個結構體

不管原來的那個heap,會新建3個ion_system_heap,分別order為8,4,0,大於4為大內存。意思就是這個heap中持有一個ion_page_pool 頁資源池子,裡面只有對應order的2的次冪,內存塊。其實就和夥伴系統有點相似。

還會設置flag為ION_HEAP_FLAG_DEFER_FREE,這個標志位後面會用到。

文件:/ drivers / staging / android / ion / ion_page_pool.c

在pool中分為2個鏈表一個是high_items,另一個是low_items。他們之間的區分在此時就是以2為底4的次冪為分界線。

文件:/ drivers / staging / android / ion / ion.c

因為打開了標志位ION_HEAP_FLAG_DEFER_FREE和heap存在shrink方法。因此會初始化兩個回收函數。

文件:/ drivers / staging / android / ion / ion_heap.c

此時會創建一個內核線程,調用ion_heap_deferred_free內核不斷的循環處理。不過由於這個線程設置的是SCHED_IDLE,這是最低等級的時間片輪轉搶占。和Handler那個adle一樣的處理規則,就是閑時處理。

在這個循環中,不斷的循環銷毀處理heap的free_list裡面已經沒有用的ion_buffer緩沖對象。

文件:/ drivers / staging / android / ion / ion_system_heap.c

注冊了heap的銷毀內存的方法。當系統需要銷毀頁的時候,就會調用通過register_shrinker注冊進來的函數。

文件:/ drivers / staging / android / ion / ion_page_pool.c

整個流程很簡單,其實就是遍歷循環需要銷毀的頁面數量,接著如果是8的次冪就是移除high_items中的page緩存。4和0則銷毀low_items中的page緩存。至於為什麼是2的次冪其實很簡單,為了銷毀和申請簡單。__free_pages能夠整頁的銷毀。

文件:/ drivers / staging / android / ion / ion.c

主要就是初始化ion_client各個參數,最後把ion_client插入到ion_device的clients。來看看ion_client結構體:

核心還是調用ion_alloc申請一個ion緩沖區的句柄。最後把數據拷貝會用戶空間。

這個實際上就是找到最小能承載的大小,去申請內存。如果8kb申請內存,就會拆分積分在0-4kb,4kb-16kb,16kb-128kb區間找。剛好dma也是在128kb之內才能申請。超過這個數字就禁止申請。8kb就會拆成2個4kb保存在第一個pool中。

最後所有的申請的page都添加到pages集合中。

文件:/ drivers / staging / android / ion / ion_page_pool.c

能看到此時會從 ion_page_pool沖取出對應大小區域的空閑頁返回上層,如果最早的時候沒有則會調用ion_page_pool_alloc_pages申請一個新的page。由於引用最終來自ion_page_pool中,因此之後申請之後還是在ion_page_pool中。

這里的處理就是為了避免DMA直接內存造成的緩存差異(一般的申請,默認會帶一個DMA標志位)。換句話說,是否打開cache其實就是,關閉了則使用pool的cache,打開了則不使用pool緩存,只依賴DMA的緩存。

我們可以看另一個dma的heap,它是怎麼做到dma內存的一致性.
文件: drivers / staging / android / ion / ion_cma_heap.c

能看到它為了能辦到dma緩存的一致性,使用了dma_alloc_coherent創建了一個所有強制同步的地址,也就是沒有DMA緩存的地址。

這里出現了幾個新的結構體,sg_table和scatterlist

文件:/ lib / scatterlist.c

這裡面實際上做的事情就是一件:初始化sg_table.
sg_table中有一個核心的對象scatterlist鏈表。如果pages申請的對象數量<PAGE_SIZE/sizeof(scatterlist),每一項sg_table只有一個scatterlist。但是超出這個數字就會增加一個scatterlist。

用公式來說:

換句話說,每一次生成scatterlist的鏈表就會直接盡可能占滿一頁,讓內存更好管理。

返回了sg_table。

初始化ion_handle,並且記錄對應的ion_client是當前打開文件的進程,並且設置ion_buffer到handle中。使得句柄能夠和buffer關聯起來。

每當ion_buffer需要銷毀,

❹ Linux DMA與Cache一致性

Cache和DMA本身似乎是兩個毫不相關的事物。Cache被用作CPU針對內存的緩存,利用程序的空間局部性和時間局部性原理,達到較高的命中率,從而避免CPU每次都必須要與相對慢速的內存交互數據來提高數據的訪問速率。DMA可以作為內存與外設之間傳輸數據的方式,在這種傳輸方式之下,數據並不需要經過CPU中轉。假設DMA針對內存的目的地址與Cache緩存的對象沒有重疊區域,DMA和Cache之間將相安無事。但是,如果DMA的目的地址與Cache所緩存的內存地址訪問有重疊,經過DMA操作,與Cache緩存對應的內存中的數據已經被修改,而CPU本身並不知道,它仍然認為Cache中的數據就是內存中的數據,那在以後訪問Cache映射的內存時,它仍然使用陳舊的Cache數據。這樣就會發生Cache與內存之間數據「不一致性」的錯誤。所謂Cache數據與內存數據的不一致性,是指在採用Cache的系統中,同樣一個數據可能既存在於Cache中,也存在於主存中,Cache與主存中的數據一樣則具有一致性,數據若不一樣則具有不一致性。需要特別注意的是,Cache與內存的一致性問題經常被初學者遺忘。在發生Cache與內存不一致性錯誤後,驅動將無法正常運行。如果沒有相關的背景知識,工程師幾乎無法定位錯誤的原因,因為這時所有的程序看起來都是完全正確的。Cache的不一致性問題並不是只發生在DMA的情況下,實際上,它還存在於Cache使能和關閉的時刻。例如,對於帶MMU功能的ARM處理器,在開啟MMU之前,需要先置Cache無效,對於TLB,也是如此。

❺ DMA與Cache具體工作原理

Cache和DMA本身似乎是兩個毫不相關的事物。Cache被用作CPU針對內存的緩存,利用程序的空間局部性和時間局部性原理,達到較高的命中率,從而避免CPU每次都必須要與相對慢速的內存交互數據來提高數據的訪問速率。DMA可以作為內存與外設之間傳輸數據的方式,在這種傳輸方式之下,數據並不需要經過CPU中轉。假設DMA針對內存的目的地址與Cache緩存的對象沒有重疊區域,DMA和Cache之間將相安無事。但是,如果DMA的目的地址與Cache所緩存的內存地址訪問有重疊,經過DMA操作,與Cache緩存對應的內存中的數據已經被修改,而CPU本身並不知道,它仍然認為Cache中的數據就是內存中的數據,那在以後訪問Cache映射的內存時,它仍然使用陳舊的Cache數據。這樣就會發生Cache與內存之間數據「不一致性」的錯誤。所謂Cache數據與內存數據的不一致性,是指在採用Cache的系統中,同樣一個數據可能既存在於Cache中,也存在於主存中,Cache與主存中的數據一樣則具有一致性,數據若不一樣則具有不一致性。需要特別注意的是,Cache與內存的一致性問題經常被初學者遺忘。在發生Cache與內存不一致性錯誤後,驅動將無法正常運行。如果沒有相關的背景知識,工程師幾乎無法定位錯誤的原因,因為這時所有的程序看起來都是完全正確的。Cache的不一致性問題並不是只發生在DMA的情況下,實際上,它還存在於Cache使能和關閉的時刻。

❻ DMA、Cache一致性具體是

Cache被用作CPU針對內存的緩存,利用程序的空間局部性和時間局部性原理,達到較高的命中率,從而避免CPU每次都必須要與相對慢速的內存交互數據來提高數據的訪問速率。DMA可以作為內存與外設之間傳輸數據的方式,在這種傳輸方式之下,數據並不需要經過CPU中轉。假設DMA針對內存的目的地址與Cache緩存的對象沒有重疊區域,DMA和Cache之間將相安無事。但是,如果DMA的目的地址與Cache所緩存的內存地址訪問有重疊,經過DMA操作,與Cache緩存對應的內存中的數據已經被修改,而CPU本身並不知道,它仍然認為Cache中的數據就是內存中的數據,那在以後訪問Cache映射的內存時,它仍然使用陳舊的Cache數據。這樣就會發生Cache與內存之間數據「不一致性」的錯誤。所謂Cache數據與內存數據的不一致性,是指在採用Cache的系統中,同樣一個數據可能既存在於Cache中,也存在於主存中,Cache與主存中的數據一樣則具有一致性,數據若不一樣則具有不一致性。需要特別注意的是,Cache與內存的一致性問題經常被初學者遺忘。在發生Cache與內存不一致性錯誤後,驅動將無法正常運行。如果沒有相關的背景知識,工程師幾乎無法定位錯誤的原因,因為這時所有的程序看起來都是完全正確的。Cache的不一致性問題並不是只發生在DMA的情況下,實際上,它還存在於Cache使能和關閉的時刻。Cache和DMA本身似乎是兩個毫不相關的事物。

❼ 請問注冊表中 「DMA緩沖區和創建硬碟緩存」 有什麼不同

1 DMA(DirectMemoryAccess,直接內存存取),顧名思義DMA功能就是讓設備可以繞過處理器,直接由內存來讀取資料。打開硬碟的DMA模式將大幅度的提高硬碟系統的功能,使我們能更快更好的進行視頻處理和文件傳輸。打開刻錄機的DMA選項,可以保障刻錄品質,並降低刻錄時的CPU佔用率。所以在我們首次連接好DVD刻錄機,進入Windows系統後要做的第一件事情就是要確認DVD刻錄機的DMA模式已打開。 2 硬碟緩存 緩存英文名為Cache,它也是內存的一種,其數據交換速度快且運算頻率高。 硬碟的緩存是硬碟與外部匯流排交換數據的場所。硬碟的讀數據的過程是將磁信號轉化為電信號後,通過緩存一次次地填充與清空,再填充,再清空,一步步按照PCI匯流排的周期送出,可見,緩存的作用是相當重要的。根據寫入方式的不同,有寫通式和回寫式兩種。寫通式在讀硬碟數據時,系統先檢查請求指令,看看所要的數據是否在緩存中,如果在的話就由緩存送出響應的數據,這個過程稱為命中。這樣系統就不必訪問硬碟中的數據,由於SDRAM的速度比磁介質快很多,因此也就加快了數據傳輸的速度。回寫式就是在寫入硬碟數據時也在緩存中找,如果找到就由緩存就數據寫入盤中,現在的多數硬碟都是採用的回寫式硬碟,這樣就大大提高了性能。

熱點內容
有保qq怎麼改密碼 發布:2024-10-12 01:26:48 瀏覽:844
sqlserver2005數據恢復 發布:2024-10-12 01:04:09 瀏覽:516
遠程訪問磁碟 發布:2024-10-12 00:59:16 瀏覽:476
glc低配有哪些配置 發布:2024-10-12 00:38:23 瀏覽:951
網關無法解析伺服器的DNS地址 發布:2024-10-12 00:33:38 瀏覽:280
windowsmysql自動備份腳本 發布:2024-10-12 00:33:37 瀏覽:188
寫短視頻的腳本的人 發布:2024-10-12 00:33:36 瀏覽:964
雲存儲免費的攝像頭 發布:2024-10-12 00:15:47 瀏覽:622
DA與腳本 發布:2024-10-12 00:14:22 瀏覽:255
如何看配置支不支持黑蘋果 發布:2024-10-12 00:13:45 瀏覽:588