linux驱动基础第一节1.1块设备

http://www.ibm.com/developerworks/cn/linux/l-cn-read/

大部分程序员可能会有这样的疑问:当在程序中调用库函数 read 时,这个请求是经过哪些处理最终到达磁盘的呢,数据又是怎么被拷贝到用户缓存区的呢?本文介绍了从 read 系统调用发出到结束处理的全过程。该过程包括两个部分:用户空间的处理、核心空间的处理。用户空间处理部分是系统调用从用户态切到核心态的过程。核心空间处理部分则是 read 系统调用在 linux 内核中处理的整个过程。

http://liu1227787871.blog.163.com/blog/static/205363197201242792814850/

====================================================================================================

 

应用程序怎么去调用这个驱动:

       当用户用cp 或者open  read  write等操作相对应的块设备的时候,底层调用对应快设备的驱动的q.request_fn= rfn函数进行操作.


 用户层ioctl 等函数(可以读写)==》kcryptd_crypt==》crypt_map====》kcryptd_queue_io====》kcryptd_io===》generic_make_request(struct bio *bio)==========>_generic_make_request(bio);


       __generic_make_request会调用q->make_request_fn=mfn 函数IO Schedule 注释:mfn=__make_request
      
       __make_request会调用__generic_unplug_device(q);

       __generic_unplug_device 进一步调用q->request_fn= rfn; 也就是simp_blkdev_do_request。(也就是自己定义的函数)

 

===========================================================================

    simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request, NULL);

  {

          struct request_queue *q = blk_alloc_queue_node(GFP_KERNEL, node_id);
         q->request_fn  = rfn;
         blk_queue_make_request(q, __make_request);//注释 其实q->make_request_fn =_make_request= mfn;等

         ...

  }

------------------------------------------------------------

想跳个io调度的话

模块初始化的时候:

   simp_blkdev_queue = blk_alloc_queue(GFP_KERNEL);
   blk_queue_make_request(simp_blkdev_queue, simp_blkdev_make_request);

 

实现这个函数即可 simp_blkdev_make_request
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值