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