零拷貝 DMA 儲存器對映

2021-07-25 20:10:45 字數 1672 閱讀 9867

參考博文 :

一直不清楚零拷貝 dma 儲存器對映的系統呼叫有什麼關係?

零拷貝( zero-copy )這種技術可以有效地改善資料傳輸的效能,在核心驅動程式(比如網路堆疊或者磁碟儲存驅動程式)處理 i/o 資料的時候,零拷貝技術可以在某種程度上減少甚至完全避免不必要 cpu 資料拷貝操作。現代的 cpu 和儲存體系結構提供了很多特徵可以有效地實現零拷貝技術,但是因為儲存體系結構非常複雜,而且網路協議棧有時需要對資料進行必要的處理,所以零拷貝技術有可能會產生很多負面的影響,甚至會導致零拷貝技術自身的優點完全喪失。

dma  是作業系統的一種io資料傳輸的方式,如圖,如果資料讀取操作(硬體與軟體)是由 dma 完成的,那麼在 dma 進行資料讀取的這一過程中,cpu 只是需要進行緩衝區管理,以及建立和處理 dma ,除此之外,cpu 不需要再做更多的事情,dma 執行完資料讀取操作之後,會通知作業系統做進一步的處理,甚至可以說資料傳輸過程中不需要cpu的參與。

儲存器對映是os提供的一套應用層儲存器對映(虛擬儲存器--虛擬位址到實體地址 (位址翻譯))的系統呼叫的介面,是零拷貝技術實現的原理之一。

nmap開闢了一段新的虛擬儲存器區域,被對映的物件可以是私有物件,也可以是共享物件,由引數決定。

傳統使用 read 和 write 系統呼叫的資料傳輸

從上面的描述可以看出,在這種傳統的資料傳輸過程中,資料至少發生了四次拷貝操作,即便是使用了 dma 來進行與硬體的通訊,cpu 仍然需要訪問資料兩次。在 read() 讀資料的過程中,資料並不是直接來自於硬碟,而是必須先經過作業系統的檔案系統層。在 write() 寫資料的過程中,為了和要傳輸的資料報的大小相吻合,資料必須要先被分割成塊,而且還要預先考慮包頭,並且要進行資料校驗和操作。

零拷貝技術的目標可以概括如下:

避免資料拷貝

將多種操作結合在一起

零拷貝技術的發展很多樣化,現有的零拷貝技術種類也非常多,而當前並沒有乙個適合於所有場景的零拷貝技術的出現。對於 linux 來說,現存的零拷貝技術也比較多,這些零拷貝技術大部分存在於不同的 linux 核心版本,有些舊的技術在不同的 linux 核心版本間得到了很大的發展或者已經漸漸被新的技術所代替。本文針對這些零拷貝技術所適用的不同場景對它們進行了劃分。概括起來,linux 中的零拷貝技術主要有下面這幾種:

前兩類方法的目的主要是為了避免應用程式位址空間和作業系統核心位址空間這兩者之間的緩衝區拷貝操作。這兩類零拷貝技術通常適用在某些特殊的情況下,比如要傳送的資料不需要經過作業系統核心的處理或者不需要經過應用程式的處理。第三類方法則繼承了傳統的應用程式位址空間和作業系統核心位址空間之間資料傳輸的概念,進而針對資料傳輸本身進行優化。我們知道,硬體和軟體之間的資料傳輸可以通過使用 dma 來進行,dma  進行資料傳輸的過程中幾乎不需要  cpu  參與,這樣就可以把 cpu 解放出來去做更多其他的事情,但是當資料需要在使用者位址空間的緩衝區和  linux  作業系統核心的頁快取之間進行傳輸的時候,並沒有類似  dma  這種工具可以使用,cpu  需要全程參與到這種資料拷貝操作中,所以這第三類方法的目的是可以有效地改善資料在使用者位址空間和作業系統核心位址空間之間傳遞的效率。

??零拷貝了避開核心態???不,只是避免資料的多次拷貝。。。。

那dpdk做到了使用者態的捕包發包等。。。同時也用到了零拷貝技術。。

那協程使用者態下,執行緒切換,進行排程,避免了系統呼叫,核心使用者態切換的開銷(記憶體棧拷貝+排程)。。。。

直接儲存器訪問DMA

原理 允許不同硬體裝置溝通,而不需要依賴cpu的大量中斷負載 對於cpu來說 需要從 吧每一片斷的資料複製到暫存器,然後把他們寫到新的地方,期間,cpu對於其它的工作就無法使用.對於dma傳輸 將資料從乙個位址空間複製到另乙個位址空間。而cpu只需初始化這個傳輸動作.在實現dma傳輸時,是由dma控...

DMA 直接儲存器訪問

dma 全稱是direct memory access,即直接儲存器訪問。dma傳輸將資料從乙個位址空間複製到另乙個位址空間,尤其適合解決批量資料的輸入 輸出問題。dma的出現主要是為了解決程式程式傳輸方式和中斷傳輸方式效率低下的問題,提高cpu的執行效率。下面分別聊一聊什麼是程式傳輸方式 中斷傳輸...

儲存器對映

通過賦予每個任務不同的虛擬 物理 位址轉換 對映,支援不同任務之間的保護。位址轉換 函式在每乙個任務中定義,在乙個任務中的 虛擬位址 空間對映到 物理記憶體 的乙個部分,而另乙個任務的虛擬位址空間對映到物理儲存器中的另外區域。就是把乙個位址連線到另乙個位址。例如,記憶體單元a的位址為x,把它對映到位...