您的位置 首页 应用

Linux内核开发之异步告诉与异步I/O(五)

“小王呢,今天开始讲AIO与设备驱动,这也是设备驱动通知与异步IO的最后一节了,下次咱们就要开始讲更高级的东西,比如中断啦,时钟等”在Linux内核中,每个IO请求都对应一个kiocb结构体,

  “小王呢,今日开端讲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);

  }

  //初始化异步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;

  //当能够拜访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节,小王,你好好收拾收拾,下次就要开端新的内容了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/219297.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部