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

來源:互聯網
上載者:User

“小王呢,今天開始講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 xxx_aio_read(struct kiocb *iocb, char *buffer, size_t count ,loff_t offset){    return xxx_defer_op(0, iocb, buf, count, pos);}//非同步寫static ssize_t xxx_aio_write(struct kiocb *iocb, const char *buffer, size_t count ,loff_t offset){    return xxx_defer_op(1, iocb, (char *)buf, count, pos);}//初始化非同步IOstatic int xxx_defer_op(int write, struct kiocb *iocb, char *buf, size_t count, loff_t pos){  struct async_work *async_wk;    int result;    //當可以訪問buffer時進行複製  if(write)  {     result = xxx_write (iocb->ki_filp, buf, count, &pos );  }  else     {           result = xxx_read (iocb->ki_filp, buf, count, &pos );     }     //如果是同步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, xxx_do_deferred_op, async_wk);   schedule_delayed_work(&async_wk->work, HZ/100);   return -EIOCBOUEUED;//控制許可權返回給使用者空間} //延遲後執行static void xxx_do_deferred_op(void *p){      struct async_work *async_wk = (struct async_work*)p;      aio_complete(async_wk_iocb, async_wk->result, 0);      kfree(async_wk);}

在上述代碼中有一個async_work的結構體定義如下:

struct async_work{  struct kiocb *iocb;//kiocb結構體指標  intresult;//執行結果  struct work_struct work; //工作結構體};
在上邊代碼中最核心的是使用aync_work結構體將操作延遲,通過schedule_delayed_work可以調度其運行,而aio_complete的調用用於通知核心驅動程式已經完成了操作。
 
最後,這一大章的內容都講完了,一連5節,小王,你好好整理整理,下次就要開始新的內容了。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.