![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
linux内核
uestc-leon
我想做一个强者
展开
-
scsi设备的请求处理函数(request_fn)
每个块设备驱动程序的核心就是它的请求处理函数,即请求队列中对应的request_fn函数struct request_queue { ... request_fn_proc *request_fn; make_request_fn *make_request_fn; prep_rq_fn *prep_rq_fn; ...}下面分析s原创 2017-06-06 14:59:56 · 2254 阅读 · 0 评论 -
IO调度层
void blk_queue_bio(struct request_queue *q, struct bio *bio){ const bool sync = !!(bio->bi_rw & REQ_SYNC); struct blk_plug *plug; int el_ret, rw_flags, where = ELEVATOR_INSERT_SORT; st原创 2017-06-04 21:25:19 · 803 阅读 · 0 评论 -
块设备层request plug/unplug机制
分类: LINUX一、基本原理Linux块设备层使用了plug/unplug(蓄流/泄流)的机制来提升IO吞吐量。基本原理为:当IO请求提交时,不知直接提交给底层驱动,而是先将其放入一个队列中(相当于水池),待一定时机或周期后再将该队列中的请求统一下发。将请求放入队列的过程即plug(蓄流)过程,统一下发请求的过程即为unplug(泄流)过程。每个请求在队列中等待的时间不会转载 2017-06-05 16:26:56 · 928 阅读 · 0 评论 -
请求队列request_queue
请求队列request_queue请求队列是由一个大的数据结构request_queue表示的。struct request_queue { struct list_head queue_head; //待处理请求的链表,请求队列中的请求用链表组织在一起 struct request *last_merge; //指向队列中首先可能合并的请求描述符 struc原创 2017-06-08 22:58:13 · 6775 阅读 · 2 评论 -
向通用块层提交一个bio请求
通用块层对bio请求的处理过程void submit_bio(int rw, struct bio *bio){ bio->bi_rw |= rw; ... generic_make_request(bio);}void generic_make_request(struct bio *bio){ struct bio_list bio_list_on_stac原创 2017-06-04 20:32:09 · 668 阅读 · 0 评论 -
bio与request(io合并与request)
由“通用块层与bio”我们知道,一次io操作就是一个bio结构,虽然我们的块设备驱动程序完全可以一次处理一个bio请求来执行一次io操作,但这会导致磁盘性能的下降,因为确定bio在磁盘上的起始扇区是很费时的,取而代之的是只要可能,内核就试图把几个相邻扇区的bio合并在一起,这样只用一次寻址。因此引入了一个新的结构request,我们将在后面对该结构进行分析。当我们要读写一些磁盘数据时,实际上创建一个原创 2017-06-08 21:16:25 · 2248 阅读 · 0 评论 -
通用块层与bio
通用块层与bio通用块层什么是通用块层?通用块层是一个内核组件,它的作用就是处理来自上层对所有块设备发出的io操作。例如,上层文件系统对磁盘上某个文件的读写操作都会转换成相应的io操作然后交给我们的通用块层进行处理。bio结构上面我们提到了很多次io操作的概念,,内核用一个叫做bio的结构体来描述一次块io操作。下面我们来分析一下bio的重要结构。struct bio { sector_t原创 2017-06-08 18:06:48 · 3017 阅读 · 1 评论 -
如何调用内核未导出的函数
如何获取内核未导出的函数地址从Linux内核的2.6某个版本开始,内核引入了导出符号的机制。只有在内核中使用EXPORT_SYMBOL或EXPORT_SYMBOL_GPL导出的符号才能在内核模块中直接使用。然而,内核并没有导出所有的符号。当我们写驱动时,如果想调用一个并未导出的函数时,我们可以使用如下办法:以get_request函数为例,该函数原型为:static struct request *原创 2017-06-04 17:12:31 · 2353 阅读 · 0 评论 -
"分散-聚集DMA"以及"scatterlist"
“分散-聚集DMA”以及”scatterlist”我们知道对磁盘的每个IO操作就是在磁盘与一些内存单元之间相互传送一些相邻扇区的内容。块设备驱动程序只要向磁盘控制器发送一些适当的命令(如前面我们所讲的scsi命令)就可以触发一次数据传送;一旦完成数据的传送,控制器就会发出一个中断通知块设备驱动程序。大多数情况,磁盘控制器直接采用DMA方式进行数据传送。DMADMA全称就是直接内存访问,是一种硬件机制原创 2017-06-07 15:34:51 · 3731 阅读 · 0 评论 -
scsi磁盘驱动中将request请求转化为scsi命令的过程(sd_prep_fn)
scsi磁盘驱动中将request请求转化为scsi命令的过程该过程主要发生在sd_prep_fn函数中,下面分析该函数static int sd_prep_fn(struct request_queue *q, struct request *rq){ struct scsi_cmnd *SCpnt; struct scsi_device *sdp = q->queuedata原创 2017-06-07 09:16:16 · 2113 阅读 · 0 评论 -
为request的每一个bio创建DMA映射
为request的每一个bio创建DMA映射先了解下几个相关的数据结构struct scsi_data_buffer { struct sg_table table; unsigned length; int resid;};struct sg_table { struct scatterlist *sgl; /* the list */ unsign原创 2017-06-07 11:22:16 · 1966 阅读 · 0 评论 -
磁盘I/O那些事
背景计算机硬件性能在过去十年间的发展普遍遵循摩尔定律,通用计算机的CPU主频早已超过3GHz,内存也进入了普及DDR4的时代。然而传统硬盘虽然在存储容量上增长迅速,但是在读写性能上并无明显提升,同时SSD硬盘价格高昂,不能在短时间内完全替代传统硬盘。传统磁盘的I/O读写速度成为了计算机系统性能提高的瓶颈,制约了计算机整体性能的发展。硬盘性能的制约因素是什么?如何根据磁盘I/O特性来转载 2017-11-02 22:33:50 · 8621 阅读 · 0 评论