sector_t nr_sects; //分区的长度(扇区数)
struct kobject kobj; //内嵌的kobject
struct kobject *holder_dir;
unsigned ios[2], sectors[2];
int policy, partno; //磁盘中分区的相对索引
};
当内核发现系统中一个新的磁盘时(在启动阶段,或将一个可移动介质插人一个驱动器中时,或在运行期附加一个外置式磁盘时),就调用alloc_disk()函数,该函数分配并初始化一个新的gendisk对象,如果新磁盘被分成了几个分区,那么alloc_disk()还会分配并初始化一个适当的hd_struct类型的数组。然后,内核调用add_disk()函数将新的gendisk对象插入到通用块层的数据结构中。
不管怎样,整个gendisk-hd_struct体系中,最重要的是请求队列结构。请求队列描述符是由一个大的数据结构request_queue表示的,其字段如下表所示:
struct request_queue
{
struct list_head queue_head; //待处理请求的链表
struct request *last_merge; //指向队列中首先可能合并的请求描述符
elevator_t *elevator; //指向elevator对象的指针(电梯算法)
struct request_list rq; //为分配请求描述符所使用的数据结构
request_fn_proc *request_fn; //实现驱动程序的策略例程入口点的方法,
//策略例程方法来处理请求队列中的下一个请求
merge_request_fn *back_merge_fn;//检查是否可能将bio合并到请求队列的最后一个请求中的方法
merge_request_fn *front_merge_fn; //检查是否可能将bio合并到队列的第一个请求中的方法
merge_requests_fn *merge_requests_fn; //试图合并请求队列中两个相邻请求的方法
make_request_fn *make_request_fn; //将一个新请求插入请求队列时调用的方法
prep_rq_fn *prep_rq_fn; //该方法把这个处理请求的命令发送给硬件设备
unplug_fn *unplug_fn; //去掉块设备的方法
merge_bvec_fn *merge_bvec_fn; //当增加一个新段时,
//该方法返回可插人到某个已存在的bio结构中的字节数(通常未定义)
activity_fn *activity_fn; //将某个请求加入请求队列时调用的方祛(通常未定义)
issue_flush_fn *issue_flush_fn; //刷新请求队列时调用的方法
//(通过连续处理所有的请求清空队列)
prepare_flush_fn *prepare_flush_fn;
softirq_done_fn *softirq_done_fn;
sector_t end_sector;
struct request *boundary_rq;
struct timer_list unplug_timer; //插入设备时使用的动态定时器
int unplug_thresh;
unsigned long unplug_delay;
struct work_struct unplug_work; //去掉设备时使用的操作队列
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-48358-2.html
我们就出兵叙利亚对美国支持武装份子往死里狂轰滥炸出一口窝囊气