當把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 else {
/* set ata dma read direction*/
atapi_set_control(base,(atapi_get_control(base)
& ~xfer_dir));
/* 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)
struct ata_port *ap = qc->ap;
void __iomem *base = (void __iomem*)ap->ioaddr.ctl_addr;
dev_dbg(qc->ap->dev, "inatapi dma start\n");
if (!(ap->udma_mask ||ap->mwdma_mask))
return;
/* start atapi transfer*/
if (ap->udma_mask)
atapi_set_control(base, atapi_get_control(base)
| ultra_start);
else
atapi_set_control(base,atapi_get_control(base)
| multi_start);
DMA過程分析
當我們在應用程式中編寫write系統呼叫,向磁碟中寫入資料時,寫入請求會先呼叫底層寫函式,將請求先寫入記憶體中的頁快取記憶體 page cache 中,寫入成功則立刻返回,真正的寫入磁碟操作會延遲執行。page cache是硬碟在記憶體中的乙個快取,是linux核心所使用的主要磁碟快取記憶體,在絕大...
網路收包過程中DMA流程
dma在進行資料傳輸時,會向cpu申請匯流排控制權,此時按理說cpu只能進行計算任務,不能進行io操作。但是實際是,依然能進行io操作。問人,查資料,大概只能說以下理由,dma和cpu對匯流排的控制是分時的,所以並不是dma獨佔,只是同時進行io時,dma優先,cpu要等待 dma收包資料傳輸的過程...
相簿磁碟快取分析
相簿磁碟快取主要是imgcache.0,imgcache.1,imgcache.idx三個檔案 其中imgcache.idx位索引檔案,其餘兩個位資料檔案 存放縮圖內容 索引檔案格式 magic max entries max bytes active region active entries a...