generic_make_request函数初探

generic_make_request()函数会接手一个已经基本初始化好的bio,并使用make_request_fn将请求置于驱动程序的请求队列上。即把该bio传给设备对应的驱动程序。参数bio中bi_dev和bi_sector都已经设定为要进行IO的对应的设备的具体地址。其中在make_request_fn(每个设备会对应一个请求队列(request_queue),该请求队列上会有对应的make_request_fn指针)函数调用后就不应该再对bio有所改动。
但是make_request可能会递归调用generic_make_request,但是对于内核态来说,栈空间是有限的。所以为了保证递归深度不能超过1,这块做了个聪明的处理。
首先看下面这段代码:

1808         if (current->bio_list) {
1809                 bio_list_add(current->bio_list, bio);
1810                 return;
1811         }

其中current->bio_list是记录了由make_request_fn提交的request组成的链表,一般情况下,如果是第一次调用generic_make_request,该current->bio_list为空的。所以这个if语句并不会执行。
接下来往下看

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值