read 系统调用剖析 下

在上一文中,作者已经将Read 整个调用过程从Linux 系统调用(SCI,system call interface)至IO调度的整个流程已经讲解的非常清晰明了,在此对作者表示致敬!

那这里我接着以Android SD卡为例子,分析IO调度后数据的处理流向!  本文代码基于linux kernel 3.0.4.

1. mmcqd 

mmcqd 是kernel在/kernel/drivers/mmc/card/queue.c  的mmc_init_queue拉起的一个内核线程,主要作用是把上层IO的request一个个向具体driver发送。


可以看到 mmc_queue_thread 才是实际做事情的,所以我们先来看看他的庐山真面目。


2. mmcqd 与sd driver的关联

从上面函数看,mmcqd的工作还是非常简单的, 在blk_fetch_request(q) 获取一笔request后,最终会通过 mq->issue_fn(mq, req) 把这笔request发送下去。 所以issue_fn 这个回调函数看起来应该就是同底层driver 通讯的关键函数。 那我们先来看看req 是如何通过issue_fn 发下去的。

在同目录下的block.c 中的mmc_blk_alloc -》mmc_blk_alloc_req函数中注册了这个回调函数。


而mmc_blk_alloc 函数是在mmc_blk_probe 函数中被调用的,所以看起来,在mmc block driver 初始化的时候已经为mmcqd做好了准备。

好了,我们还是继续看看 mmc_blk_issue_rq到底又是如何把我们的request发送给sd card driver的。


这个函数其实也是挺简单的,虽说有几个分支,但是很明显,大部分的request都是通过 ret = mmc_blk_issue_rw_rq(mq, req); 来发送的。自这个函数之后就会调用到mmc 的core部分,之后便进入真正的SD卡的数据传输。更底层的过程我就不在这次讲了,后面专门针对sd driver部分做分析!


3. mmcqd 与IO 的关联

在上一文中曾经讲到request_fn就是block曾的入口函数。

所以我们来看看rfn 具体是那个函数呢?

在/kernel/drivers/mmc/card/queue.c 的 mmc_init_queue 中注册了这个函数。

blk_init_queue(mmc_request, lock);
在上文中已经讲过,这里就不再重复分析。
所以,接下来我们看看IO实际调用的函数为 mmc_request

从上面函数可以看到,如果mq->req 是空的,我们则唤醒,mq->thread 来发送一笔req 下去。 至此mmcqd与上层IO的关联也很清楚了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值