「小王呢,今天開始講aio與裝置驅動,這也是裝置驅動通知與非同步io的最後一節了,下次咱們就要開始講更高階的東西,比如中斷啦,時鐘等」
在linux核心中,每個io請求都對應乙個kiocb結構體,其ki_filp成員指向對應的file指標,通過is_sync_kiocb可以判斷某kiocb時候為同步io請求,如果非真,表示是非同步io請求。
塊裝置和網路裝置本身就是非同步的。只有字元裝置驅動必須明確指出應支援aio.需要說明的是aio對於大多數字元裝置而言都不是必須的。只有少數才需要。
在字元裝置驅動程式中,file_operations包含了3個和aio相關的函式。如下:
ssize_t (*aio_read) (struct kiocb *iocb, char *buffer, size_t count ,loff_t offset);ssize_t (*aio_write) (struct kiocb *iocb, const
char *buffer, size_t count ,loff_t offset);
int (*aio_fsync) (struct kiocb *iocb, int datasync);
aio_read()和aio_write()與file_operation中的read()和write()中的offset引數不同,它直接傳遞值,而後者傳遞的是指標。這兩個函式本身也不一定完成讀寫操作,它只是發起,初始化讀寫操作。
下面來看看實際的**部分:
//非同步讀static ssize_t ***_aio_read(struct kiocb *iocb, char *buffer, size_t count ,loff_t offset)
//非同步寫
static ssize_t ***_aio_write(struct kiocb *iocb, const
char *buffer, size_t count ,loff_t offset)
//初始化非同步io
static
int ***_defer_op(int
write, struct kiocb *iocb, char *buf, size_t count, loff_t pos)
else
//如果是同步iocb, 立即返回狀態
if(is_sync_kiocb(iocb))
return resutl;
//否則,推後幾us執行
async_wk = kmalloc(sizeof(*async_wk), gfp_kernel ));
if(async_wk==null)
return result;
async_wk->aiocb = iocb;
async_ wk->result = result;
init_work(&async_wk->work, ***_do_deferred_op, async_wk);
schedule_delayed_work(&async_wk->work, hz/100);
return -eiocboueued;//控制許可權返回給使用者空間
} //延遲後執行
static
void ***_do_deferred_op(void *p)
在上述**中有乙個async_work的結構體定義如下:
struct async_work;
在上邊**中最核心的是使用aync_work結構體將操作延遲,通過schedule_delayed_work可以排程其執行,而aio_complete的呼叫用於通知核心驅動程式已經完成了操作。
最後,這一大章的內容都講完了,一連5節,小王,你好好整理整理,下次就要開始新的內容了。
Linux核心開發之非同步通知與非同步I O 一
小王,聽說過錦上添花吧.我拍拍下王的頭說。還錦上添花你,為你上次提的幾個東東,我是頭上長包.小王氣憤地瞪著我。啊,為啥這樣呢,本來還特意拒絕了mm的約會,抽出時間打算給你說點高階的東東,看來現在是不行了 我吃驚道,這樣吧,這次就給你講些和前邊有關的東西,也不失為錦上添花不是?好,我也是這麼打算的,就...
Linux核心開發之非同步通知與非同步I O 二
曾經有乙份真摯的愛情擺在面前,我卻不懂珍惜 曾經有乙個承諾,我卻倍感珍惜,今天一定要好好講講.講講啥,講講上節說的那個非同步通知的例子唄,大家喜歡看 咋們就先上 struct globalfifo dev 檔案釋放函式 int globalfifo release struct inode inod...
Linux核心開發之非同步通知與非同步I O 一
非同步通知 很簡單,一旦裝置準備好,就主動通知應用程式,這種情況下應用程式就不需要查詢裝置狀態,這是不是特像硬體上常提的 中斷的概念 上邊比較 準確的說法其實應該叫做 訊號驅動的非同步i o 訊號是在軟體層次上對中斷機制的一種模擬。阻塞i o意味著一直等待裝置可訪問時再訪問,非阻塞i o意味著使用p...