- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Linux操作系统内核分析 湘潭大学信息工程学院 讲课内容 设备管理简介 硬盘驱动 虚拟盘驱动 块设备的操作方式 设备管理模块读处理过程 进程向缓冲区模块提出读块(2扇区)请求。 缓冲区模块检查该块是否已经被缓冲。如果已经被缓冲,则直接返回缓冲的块;否则,向设备管理模块提出读请求。 设备管理模块接受请求。如果设备不忙,则向设备发送命令;否则,把请求插入到设备的请求队列中。 缓冲区模块挂起进程。 设备控制器从设备中读入数据到自己的缓冲区中,并产生中断。 设备中断处理程序把数据从控制器缓冲区读到内存缓冲区,然后唤醒进程。 P248第267 设备管理模块写处理过程 缓冲区模块决定要回写被缓冲的块。如果该块是脏的,向设备管理模块提出写请求。 设备管理模块接受请求。如果设备不忙,则向设备发送命令和数据;否则,把请求插入到设备的请求队列中。 缓冲区模块挂起进程。 设备控制器把数据写入到设备并产生中断。 设备中断处理程序唤醒进程。 低级读写流程 设备号 设备是通过主设备号和次设备号(两者构成了物理设备号)来进行区分的 主设备号: 区分不同类型的设备(P131表6-2) 次设备号: 区分相同类型设备中的个体 逻辑设备号用于区分不同的设备,逻辑设备号=主设备号8+次设备号 #define MAJOR(a) (((unsigned)(a))8) #define MINOR(a) ((a)0xff) 块设备请求项 struct request { int dev; //逻辑设备号,-1表示是自由的请求项 int cmd; //命令(P395第26—29) int errors; //如果超过MAX_ERRORS,要重置设备 unsigned long sector; //要读或写的开始扇区 unsigned long nr_sectors; //要读或写的数量 char * buffer; //数据缓冲区指针 struct task_struct * waiting; //等待请求完成的进程队列 struct buffer_head * bh; //缓冲区头指针 struct request * next; //同一设备的下一个请求项 }; 块设备请求项数组 为方便查找空闲请求项,建立了请求项数组。 struct request request[NR_REQUEST]; //定义在ll_rw_blk.c(P150第21行) #define NR_REQUEST 32 //定义在blk.h(P134第15行) 块设备结构 每个块设备都有自己的独立的请求队列。为方便管理队列,建立了块设备结构。 struct blk_dev_struct { void (*request_fn)(void); //设备独有的请求处理函数指针 struct request * current_request; //请求队列头指针 }; //blk.h(P134第45行或P130) 块设备结构 Linux支持多种块设备,为所有这些块设备结构建立了一个数组,数组下标就是设备的主设备号。 struct blk_dev_struct blk_dev[NR_BLK_DEV] //P151第32行 #define NR_BLK_DEV 7 数据结构间的关系 设备管理模块接口 初始化 void blk_dev_init(void) //定义在ll_rw_blk.c(P153第157行) 作用:完成请求项数组的初始化 void hd_init(void) //定义在hd.c(P146第343行) void floppy_init(void) //定义在floppy.c(P168第457行) long rd_init(long mem_start, int length) //定义在ramdisk.c(P155第52行) 低级读写操作 void ll_rw_block (int rw, struct buffer_head * bh) //定义在ll_rw_blk.c(P153第145行) 作用:完成低级读写操作 参数:rw——读写命令 bh——缓冲区头指针 电梯算法 磁头朝一个方向运动来满足该方向上最近的请求。当该方向上所有的请求都处理完之后,则反方向来处理其它请求。 电梯算法 在一般情况下,所有请求都能获得合适的处理。但是,在极端情况下仍然会造成饿死现象。 例如:上例中,如果不断的有第5柱面之后的处理请求,则第1、2柱面的处理请求会饿死。 电梯算法改进 5 7 5
文档评论(0)