⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ll_rw_blk.c.txt

📁 linux内核学习笔记 希望想看的人可以很快下载到
💻 TXT
字号:
any question,send email to netxiong@263.net

相关文件:
	/linux/blkdev.h
	/drivers/block/genhd.c
	/drivers/block/elevator.c

**********************基本数据结构*****************************
(1):int read_ahead[MAX_BLKDEV];
	#指示对于相应的major好的块设备怎样read ahead

(2):struct blk_dev_struct blk_dev[MAX_BLKDEV];
	#结构定义在blkdev.h中
	#相应的major号的设备被使用的话,就置位

(3):int * blk_size[MAX_BLKDEV]
	# blk_size contains the size of all block-devices in units of 1024 	  byte * sectors
	#它的形式位 blk_size[MAJOR][MINOR]

(4):int * blksize_size[MAX_BLKDEV]
	#如果不置位的话,那么blk_size就被使用,用1024来计算大小。
	#形式为blksize_size[MAJOR][MINOR]


/*
 * 这个结构表明相应的物理设备的sector的大小,单位为字节
 */
(5):int * hardsect_size[MAX_BLKDEV]
	# hardsect_size contains the size of the hardware sector of a device.
	# if (!hardsect_size[MAJOR])
	             then 512 bytes is assumed.
	  else
 	              sector_size is hardsect_size[MAJOR][MINOR]
	#置位与否,可以表明sect的大小
***************************************************************


**************************常量*********************************
(1):static int batch_requests, queue_nr_requests;//队列上的请求数目	

(2):int * max_sectors[MAX_BLKDEV];	//每一个请求上面的最大sector数目
***************************************************************	


**********************初始化函数********************************
(1):int __init blk_dev_init(void)
	#调用z2_init,rd_init……等块设备驱动程序	
	#该函数再genhd.c中北device_init调用,
***************************************************************



**********************request请求处理函数***********************
(1):void blk_init_queue(request_queue_t * q, request_fn_proc * rfn)
	#如果一个块设备想利用标准的请求处理里程的话,就调用这个函数
	#blk_init_free_list(q)	//对free_list进行初始化

	elevator_init(&q->elevator, ELEVATOR_LINUS);//电梯处理方式的选择,默认是linux形式	

	#q->request_fn           = rfn;//这个例程再有request并要求处理时调用
         q->back_merge_fn        = ll_back_merge_fn;
         q->front_merge_fn       = ll_front_merge_fn;
         q->merge_requests_fn    = ll_merge_requests_fn;
         q->make_request_fn      = __make_request;//这些都是标准处理例程
	#这个函数必须和blk_cleanup_queue配对调用

(3):blk_queue_make_request()
	这个函数用来替换q->make_request_fn中的标准处理函数。

(2):static void blk_init_free_list(request_queue_t *q)
	#INIT_LIST_HEAD(&q->request_freelist[READ]);
         INIT_LIST_HEAD(&q->request_freelist[WRITE]);
         INIT_LIST_HEAD(&q->pending_freelist[READ]);
         INIT_LIST_HEAD(&q->pending_freelist[WRITE]);//初始化列表
	#for (i = 0; i < queue_nr_requests; i++) {
                rq = kmem_cache_alloc(request_cachep, SLAB_KERNEL);
                memset(rq, 0, sizeof(struct request));
                rq->rq_status = RQ_INACTIVE;
                list_add(&rq->table, &q->request_freelist[i & 1]);
         }//将request_nr_requests个请求分为两半,read和write每个半数

(3):void blk_cleanup_queue(request_queue_t * q)
	# count -= __blk_cleanup_queue(&q->request_freelist[READ]);
	#对请求列表进行清理。调用__blk_cleanup_queue把list中的请求都释放掉


(4):static inline int get_max_sectors(kdev_t dev)
        if (!max_sectors[MAJOR(dev)])	
                return MAX_SECTORS;
        return max_sectors[MAJOR(dev)][MINOR(dev)];
	#得到最大的sector数

(5)inline request_queue_t *blk_get_queue(kdev_t dev)	//从设备号得到该设备所对应的请求队列
	
****************************************************************

*******************请求处理函数**********************************
(1):generic_make_request(dev,rw,bh)
	这个是标准的请求处理函数,他值按照bh中的bh->b_rdev来判断送到那个设备进行处理
	while (q->make_request_fn(q, rw, bh));	//最后调用请求处理函数,一般是__make_request

(2):static int __make_request(request_queue_t * q, int rw,struct buffer_head * bh)
	//这个是主要的处理函数
	
	elevator_t *elevator = &q->elevator;	//得到这个请求队列的请求电梯处理类	

	max_sectors = get_max_sectors(bh->b_rdev);	//从这里开始进行请求的合并
	el_ret = elevator->elevator_merge_fn(q, &req, head, bh, rw,max_sectors);
		//这个函数确定合并的方式---前合并还是后合并,函数原型在/block/elevator.c中
	switch (el_ret) {
		case ELEVATOR_BACK_MERGE:
			if (!q->back_merge_fn(q, req, bh, max_segments)	//调用请求队列的merge函数
			……	//后合并,放在一个请求的后面
		case ELEVATOR_FRONT_MERGE:
			if (!q->front_merge_fn(q, req, bh, max_segments) //调用请求队列的merge函数
			……	//前合并,放在一个请求的前面
		case ELEVATOR_NO_MERGE:
			……	//无法合并,产生一个新的请求
	}
	……	
	req->hard_sector = req->sector = sector;
        req->hard_nr_sectors = req->nr_sectors = count;
        req->current_nr_sectors = req->hard_cur_sectors = count;
	……	//对request进行设置,主要是使用buffer_head和一些计算出来的结果对request进行设置
	
	blk_started_io(count);	//空函数,不用例会
	add_request(q, req, insert_here);	//加入到请求处理队列中。
	
*****************************************************************




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -