读书笔记:写一个块设备驱动(2)

上一节给出了一个块驱动程序的框架。其中

static struct request_queue *simp_blkdev_queue;

这个结构很重要,我们将它的处理函数设置为:

simp_blkdev_queue = blk_init_queue(simp_blkdev_do_request,NULL);

但是内核却为我们做了很多我们不知道的事情,首先当一个bio请求过来时,内核调用

void generic_make_request(struct bio *bio)

函数来处理,然后如果驱动程序没有对request_queue结构中的成员

make_request_fn

赋值,则内核调用自己默认的或者设置好的I/O调度器,对bio进行合并和筛选最后再调用

simp_blkdev_do_request

进行工作。

现在我们对simp_blkdev_queue中的make_request_fn成员进行设置,即去除I/O调度器,又我们自己进行调度和选择。

simp_blkdev_queue = blk_alloc_queue(GFP_KERNEL);

blk_queue_make_request(simp_blkdev_queue,simp_blkdev_make_request);

simp_blkdev_make_request就是接下来调度和处理的函数。

2016.04.10

你可能感兴趣的:(读书笔记:写一个块设备驱动(2))