linux内核完全注释(课件)第六章.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《linux内核完全注释(课件)第六章.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- linux 内核 完全 注释 课件 第六
- 资源描述:
-
1、Linux操作系统内核分析湘潭大学信息工程学院讲课内容设备管理简介硬盘驱动虚拟盘驱动块设备的操作方式P132图6-2设备管理模块读处理过程进程向缓冲区模块提出读块(2扇区)请求。缓冲区模块检查该块是否已经被缓冲。如果已经被缓冲,则直接返回缓冲的块;否则,向设备管理模块提出读请求。设备管理模块接受请求。如果设备不忙,则向设备发送命令;否则,把请求插入到设备的请求队列中。缓冲区模块挂起进程。设备控制器从设备中读入数据到自己的缓冲区中,并产生中断。设备中断处理程序把数据从控制器缓冲区读到内存缓冲区,然后唤醒进程。P248第267设备管理模块写处理过程缓冲区模块决定要回写被缓冲的块。如果该块是脏的,向
2、设备管理模块提出写请求。设备管理模块接受请求。如果设备不忙,则向设备发送命令和数据;否则,把请求插入到设备的请求队列中。缓冲区模块挂起进程。设备控制器把数据写入到设备并产生中断。设备中断处理程序唤醒进程。低级读写流程根据缓冲区头创建一个请求队列中没有请求把请求插入到设备的请求队列中向设备发送命令是否说明设备空闲设备号设备是通过主设备号和次设备号(两者构成了物理设备号)来进行区分的l主设备号: 区分不同类型的设备(P131表6-2)l次设备号: 区分相同类型设备中的个体逻辑设备号用于区分不同的设备,逻辑设备号=主设备号8)#define MINOR(a) (a)&0 xff)P395第33、34
3、行逻辑设备号块设备请求项struct request int dev; /逻辑设备号,-1表示是自由的请求项int cmd; /命令(P395第2629)int errors; /如果超过MAX_ERRORS,要重置设备unsigned long sector; /要读或写的开始扇区unsigned long nr_sectors; /要读或写的数量char * buffer; /数据缓冲区指针struct task_struct * waiting; /等待请求完成的进程队列struct buffer_head * bh; /缓冲区头指针struct request * next; /同一设
4、备的下一个请求项;P131或P134第23行块设备请求项数组为方便查找空闲请求项,建立了请求项数组。struct request requestNR_REQUEST; /定义在ll_rw_blk.c(P150第21行)#define NR_REQUEST32 /定义在blk.h(P134第15行)块设备结构每个块设备都有自己的独立的请求队列。为方便管理队列,建立了块设备结构。struct blk_dev_struct void (*request_fn)(void); /设备独有的请求处理函数指针struct request * current_request;/请求队列头指针 ;/blk.h
5、(P134第45行或P130)块设备结构Linux支持多种块设备,为所有这些块设备结构建立了一个数组,数组下标就是设备的主设备号。struct blk_dev_struct blk_devNR_BLK_DEV/P151第32行#define NR_BLK_DEV7数据结构间的关系P132图6-1设备管理模块接口设备管理模块文件管理模块(缓冲区)ll_rw_block中断管理模块hd_interruptfloppy_interrupt初始化模块blk_dev_inithd_initfloppy_initsetup初始化void blk_dev_init(void)/定义在ll_rw_blk.c(
6、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缓冲区头指针电梯算法磁头朝一个方向运动来满足该方向上
7、最近的请求。当该方向上所有的请求都处理完之后,则反方向来处理其它请求。例如:磁头正在第5柱面处理请求,磁头向内运动,其后有5个请求到达,分别是第7、2、6、1、8柱面上的请求。则处理顺序是: 5 6 7 8 2 1电梯算法在一般情况下,所有请求都能获得合适的处理。但是,在极端情况下仍然会造成饿死现象。例如:上例中,如果不断的有第5柱面之后的处理请求,则第1、2柱面的处理请求会饿死。电梯算法改进5 7 5 7 2 5 6 7 2 5 6 7 1 2 5 6 7 1 2 8对于请求Q,如果队列中存在A1和A2,1、满足A1QA2,则把Q插入到A1和A2中2、满足QA2cmdcmd | (s1)-c
8、md=(s2)-cmd & (s1)-dev dev | (s1)-dev = (s2)-dev & (s1)-sector sector)P134第40行read、write、reada、writea宏可以简单理解为s1next)& IN_ORDER(req,tmp-next)IN_ORDER(tmp,req)&IN_ORDER(req,tmp-next)|!IN_ORDER(tmp,tmp-next)& IN_ORDER(req,tmp-next)tmpreqnextreqnext tmpll_rw_block根据缓冲区头创建一个请求队列中没有请求把请求插入到设备的请求队列中向设备发送命令
9、是否说明设备空闲make_requestP150图6-4讲课内容设备管理简介硬盘驱动虚拟盘驱动硬盘分类按照接口分,硬盘可以分为IDE(ATA)硬盘SCSI硬盘FC硬盘SATA硬盘硬盘内部结构硬盘参数表在setup.s中,Linux通过BIOS调用读取了硬盘的参数,并保存在物理地址0 x90080处(第1块硬盘)和物理地址0 x90090处(第2块硬盘)。(参见P44表3-3)硬盘参数表位移大小说明0 x002B柱面数0 x021B磁头数0 x032BAT硬盘为00 x052B写前预补偿柱面号*40 x071BAT硬盘为00 x081B控制字节位0 未用 位4 未用位1 保留(0) 位5 有坏区
10、图则置1位2 允许复位 位6 禁止ECC重试位3 若磁头数大于8则为1,否则为0 位7 禁止访问重试0 x091BAT硬盘为00 x0A1BAT硬盘为00 x0B1BAT硬盘为00 x0C2B磁头着陆柱面号0 x0E1B每磁道扇区数0 x0F1B保留硬盘结构struct hd_i_struct int head,sect,cyl,wpcom,lzone,ctl;/定义在hd.c(P139第45行)硬盘分区表一个硬盘最多可以分为4个区,每个分区用一个整数标识(次设备号)0对应第一个硬盘1、2、3、4对应第一个硬盘的四个分区5对应第二个硬盘6、7、8、9对应第二个硬盘的四个分区硬盘逻辑设备号逻辑设
展开阅读全文