DMA過程分析

2021-06-22 07:20:22 字數 2420 閱讀 7553

當我們在應用程式中編寫write系統呼叫,向磁碟中寫入資料時,寫入請求會先呼叫底層寫函式,將請求先寫入記憶體中的頁快取記憶體(page cache)中,寫入成功則立刻返回,真正的寫入磁碟操作會延遲執行。page cache是硬碟在記憶體中的乙個快取,是linux核心所使用的主要磁碟快取記憶體,在絕大多數情況下,核心在讀寫磁碟時都引用page cache(極少數應用會繞過頁快取記憶體,如資料庫軟體)。

當把page cache中的一頁資料寫到塊裝置之前,核心首先檢查對應的頁是否已經在快取記憶體中,如果不在,就要先在其中增加乙個新項,並用要寫到磁碟中的資料填充該項。i/o資料的傳送並不是馬上開始,而是要延遲幾秒後才對磁碟進行更新,從而使程序有機會對要寫入磁碟的資料做進一步的修改(也就是核心進行延遲寫操作)。

當核心以檔案系統、虛擬記憶體子系統或者系統呼叫的形式決定從塊i/o裝置輸入、輸出塊資料時,它將再結合乙個bio結構,用來描述這個操作。該結構被傳遞給 i/o**,**會把它合併到乙個已經存在的request結構中,或者根據需要,再建立乙個新的request結構。bio結構包含了驅動程式執行請求的全部資訊,而不必與初始化這個請求的使用者空間的程序相關聯。

核心中塊裝置的i/o操作基本容器由bio結構體表示,定義在中,該結構體代表了正在現場的(活動的)以片段(segment)鍊錶形式組織的塊i/o操作。乙個片段是一小塊連續的記憶體緩衝區。這樣的好處就是不需要保證單個緩衝區一定要連續。所以通過片段來描述緩衝區,即使乙個緩衝區分散在記憶體的多個位置上,bio結構體也 能對核心保證i/o操作的執行,這樣的就叫做聚散i/o(scatter/gather).

bio為通用層的主要資料結構,既描述了磁碟的位置,又描述了記憶體的位置,是上層核心vfs與下層驅動的連線紐帶。

struct bio else

dma_map_sg(ap->dev,qc->sg, qc->n_elem, dir);

/* fill the atapi dma controller *//挨個填寫sg結構體,sg結構體用來指向每個要傳輸的記憶體塊,對應以上步驟(1)

for_each_sg(qc->sg, sg,qc->n_elem, si)

/* set the last descriptor to stop mode*/

dma_desc_cpu[qc->n_elem - 1].cfg&= ~(dmaflow | ndsize);

flush_dcache_range((unsignedint)dma_desc_cpu,

(unsigned int)dma_desc_cpu +

qc->n_elem *sizeof(struct dma_desc_array));

/* enable ata dma operation*/

//設定從bmdma_prd_dma指//定的記憶體位置處獲取scatterlist結構體

set_dma_curr_desc_addr(channel, (unsigned long*)ap->bmdma_prd_dma);

//初始化dma操作

set_dma_x_count(channel, 0);

set_dma_x_modify(channel, 0);

set_dma_config(channel, config);

ssync();

/* send ata dma command */

/*這裡要注意,雖然是傳送dma命令,但是真正的dma操作還沒開始;

*該函式中有設定各種ata裝置暫存器,並等待設定結束後返回

*/bfin_exec_command(ap, &qc->tf);

//根據初始化時設定的io操作方向,確定dma方向,對應步驟(2)

if (qc->tf.flags &ata_tflag_write) else

/* reset all transfer count */

atapi_set_control(base,atapi_get_control(base) | tfrcnt_rst);

/* set atapi state machine contorl interminate sequence */

atapi_set_control(base,atapi_get_control(base) | end_on_term);

/* set transfer length to the totalsize of sg buffers */

atapi_set_xfer_len(base, size >>1);

/***     bfin_bmdma_start- start an ide dma transaction

*     @qc:info associated with this ata transaction.

**     note:original code is ata_bmdma_start().

*/ static void bfin_bmdma_start(structata_queued_cmd *qc)

磁碟DMA過程分析

當把page cache中的一頁資料寫到塊裝置之前,核心首先檢查對應的頁是否已經在快取記憶體中,如果不在,就要先在其中增加乙個新項,並用要寫到磁碟中的資料填充該項。i o資料的傳送並不是馬上開始,而是要延遲幾秒後才對磁碟進行更新,從而使程序有機會對要寫入磁碟的資料做進一步的修改 也就是核心進行延遲寫...

DMA 二 DMA介面函式

流式dma對映,使用這個函式前需要事先分配連續物理記憶體,這個函式只是物理位址對映到虛擬位址 dma map single dma unmap single dma池 dma如果使用cache,那麼一定要考慮cache的一致性。解決dma導致的一致性的方法最簡單的就是禁止dma目標位址範圍內的cac...

dma匯流排全稱 DMA匯流排

dma 是所有現代電腦的重要特色,他允許不同速度的硬體裝置來溝通,而不需要依於 cpu 的大量 中斷 負載。否則,cpu 需要從 把每一片段的資料複製到 暫存器,然後把他們再次寫回到新的地方。在這個時間中,cpu 對於其他的工作來說就無法使用。dma 傳輸主要地將乙個記憶體區從乙個裝置複製到另外乙個...