<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux內核開(kāi)發(fā)之異步通知與異步I/O(五)

Linux內核開(kāi)發(fā)之異步通知與異步I/O(五)

作者: 時(shí)間:2016-12-26 來(lái)源:網(wǎng)絡(luò ) 收藏

  “小王呢,今天開(kāi)始講AIO與設備驅動(dòng),這也是設備驅動(dòng)通知與異步IO的最后一節了,下次咱們就要開(kāi)始講更高級的東西,比如中斷啦,時(shí)鐘等”

本文引用地址:http://dyxdggzs.com/article/201612/342072.htm

  在內核中,每個(gè)IO請求都對應一個(gè)kiocb結構體,其ki_filp成員指向對應的file指針,通過(guò)is_sync_kiocb可以判斷某Kiocb時(shí)候為同步IO請求,如果非真,表示是異步IO請求。

  塊設備和網(wǎng)絡(luò )設備本身就是異步的。只有字符設備驅動(dòng)必須明確指出應支持AIO.需要說(shuō)明的是AIO對于大多數字符設備而言都不是必須的。只有少數才需要。

  在字符設備驅動(dòng)程序中,file_operations包含了3個(gè)和AIO相關(guān)的函數。如下:

  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參數不同,它直接傳遞值,而后者傳遞的是指針。這兩個(gè)函數本身也不一定完成讀寫(xiě)操作,它只是發(fā)起,初始化讀寫(xiě)操作。

  下面來(lái)看看實(shí)際的代碼部分:

  //異步讀

  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);

  }

  //異步寫(xiě)

  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);

  }

  //初始化異步IO

  static int xxx_defer_op(int write, struct kiocb *iocb, char *buf, size_t count, loff_t pos)

  {

  struct async_work *async_wk;

  int result;

  //當可以訪(fǎng)問(wèn)buffer時(shí)進(jìn)行復制

  if(write)

  {

  result = xxx_write (iocb->ki_filp, buf, count, &pos );

  }

  else

  {

  result = xxx_read (iocb->ki_filp, buf, count, &pos );

  }

  //如果是同步IOCB, 立即返回狀態(tài)

  if(is_sync_kiocb(iocb))

  return resutl;

  //否則,推后幾u(yù)s執行

  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;//控制權限返回給用戶(hù)空間

  }

  //延遲后執行

  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);

  }

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

  struct async_work

  {

  struct kiocb *iocb;//kiocb結構體指針

  intresult;//執行結果

  struct work_struct work; //工作結構體

  };

  在上邊代碼中最核心的是使用aync_work結構體將操作延遲,通過(guò)schedule_delayed_work可以調度其運行,而aio_complete的調用用于通知內核驅動(dòng)程序已經(jīng)完成了操作。

  最后,這一大章的內容都講完了,一連5節,小王,你好好整理整理,下次就要開(kāi)始新的內容了。



關(guān)鍵詞: Linux 異步I/O

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>