Linux核心開發之非同步通知與非同步I O 五

2021-06-22 08:26:45 字數 1882 閱讀 5429

「小王呢,今天開始講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...