linux内核完全注释(幻灯片)第六章

上传人:F****n 文档编号:88134628 上传时间:2019-04-19 格式:PPT 页数:55 大小:228.50KB
返回 下载 相关 举报
linux内核完全注释(幻灯片)第六章_第1页
第1页 / 共55页
linux内核完全注释(幻灯片)第六章_第2页
第2页 / 共55页
linux内核完全注释(幻灯片)第六章_第3页
第3页 / 共55页
linux内核完全注释(幻灯片)第六章_第4页
第4页 / 共55页
linux内核完全注释(幻灯片)第六章_第5页
第5页 / 共55页
点击查看更多>>
资源描述

《linux内核完全注释(幻灯片)第六章》由会员分享,可在线阅读,更多相关《linux内核完全注释(幻灯片)第六章(55页珍藏版)》请在金锄头文库上搜索。

1、Linux操作系统内核分析,湘潭大学信息工程学院,讲课内容,设备管理简介 硬盘驱动 虚拟盘驱动,块设备的操作方式,P132图6-2,设备管理模块读处理过程,进程向缓冲区模块提出读块(2扇区)请求。 缓冲区模块检查该块是否已经被缓冲。如果已经被缓冲,则直接返回缓冲的块;否则,向设备管理模块提出读请求。 设备管理模块接受请求。如果设备不忙,则向设备发送命令;否则,把请求插入到设备的请求队列中。 缓冲区模块挂起进程。 设备控制器从设备中读入数据到自己的缓冲区中,并产生中断。 设备中断处理程序把数据从控制器缓冲区读到内存缓冲区,然后唤醒进程。 P248第267,设备管理模块写处理过程,缓冲区模块决定要

2、回写被缓冲的块。如果该块是脏的,向设备管理模块提出写请求。 设备管理模块接受请求。如果设备不忙,则向设备发送命令和数据;否则,把请求插入到设备的请求队列中。 缓冲区模块挂起进程。 设备控制器把数据写入到设备并产生中断。 设备中断处理程序唤醒进程。,低级读写流程,根据缓冲区头 创建一个请求,队列中没有请求,把请求插入到设 备的请求队列中,向设备发送命令,是,否,说明设备空闲,设备号,设备是通过主设备号和次设备号(两者构成了物理设备号)来进行区分的 主设备号: 区分不同类型的设备(P131表6-2) 次设备号: 区分相同类型设备中的个体 逻辑设备号用于区分不同的设备,逻辑设备号=主设备号8) #d

3、efine MINOR(a) (a)&0xff),P395第33、34行,逻辑设备号,块设备请求项,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_

4、head * bh; /缓冲区头指针 struct request * next; /同一设备的下一个请求项 ;,P131或P134第23行,块设备请求项数组,为方便查找空闲请求项,建立了请求项数组。 struct request requestNR_REQUEST; /定义在ll_rw_blk.c(P150第21行) #define NR_REQUEST 32 /定义在blk.h(P134第15行),块设备结构,每个块设备都有自己的独立的请求队列。为方便管理队列,建立了块设备结构。 struct blk_dev_struct void (*request_fn)(void); /设备独有的请

5、求处理函数指针 struct request * current_request; /请求队列头指针 ; /blk.h(P134第45行或P130),块设备结构,Linux支持多种块设备,为所有这些块设备结构建立了一个数组,数组下标就是设备的主设备号。 struct blk_dev_struct blk_devNR_BLK_DEV /P151第32行 #define NR_BLK_DEV 7,数据结构间的关系,P132图6-1,设备管理模块接口,设备管理模块,文件管理模块 (缓冲区),ll_rw_block,中断管理模块,hd_interrupt floppy_interrupt,初始化模块,

6、blk_dev_init hd_init floppy_init setup,初始化,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

7、buffer_head * bh) /定义在ll_rw_blk.c(P153第145行) 作用:完成低级读写操作 参数:rw读写命令 bh缓冲区头指针,电梯算法,磁头朝一个方向运动来满足该方向上最近的请求。当该方向上所有的请求都处理完之后,则反方向来处理其它请求。,例如: 磁头正在第5柱面处理请求,磁头向内运动,其后有5个请求到达,分别是第7、2、6、1、8柱面上的请求。则处理顺序是: 5 6 7 8 2 1,电梯算法,在一般情况下,所有请求都能获得合适的处理。但是,在极端情况下仍然会造成饿死现象。 例如:上例中,如果不断的有第5柱面之后的处理请求,则第1、2柱面的处理请求会饿死。,电梯算法改

8、进,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、满足QA2A1,则把Q插入到A1和A2中 3、否则插入到队列最后,IN_ORDER,#define IN_ORDER(s1,s2) (s1)-cmdcmd | (s1)-cmd=(s2)-cmd & (s1)-dev dev | (s1)-dev = (s2)-dev & (s1)-sector sector),P134第40行,read、write、reada、writea,宏可以简单理解为s1s2是否为真,add_re

9、quest,(IN_ORDER(tmp,req) | !IN_ORDER(tmp,tmp-next) & IN_ORDER(req,tmp-next) IN_ORDER(tmp,req)&IN_ORDER(req,tmp-next) | !IN_ORDER(tmp,tmp-next)& IN_ORDER(req,tmp-next),tmpnext,reqnext tmp,ll_rw_block,根据缓冲区头 创建一个请求,队列中没有请求,把请求插入到设 备的请求队列中,向设备发送命令,是,否,说明设备空闲,make_request,P150图6-4,讲课内容,设备管理简介 硬盘驱动 虚拟盘驱动

10、,硬盘分类,按照接口分,硬盘可以分为 IDE(ATA)硬盘 SCSI硬盘 FC硬盘 SATA硬盘,硬盘内部结构,硬盘参数表,在setup.s中,Linux通过BIOS调用读取了硬盘的参数,并保存在物理地址0x90080处(第1块硬盘)和物理地址0x90090处(第2块硬盘)。(参见P44表3-3),硬盘参数表,硬盘结构,struct hd_i_struct int head,sect,cyl,wpcom,lzone,ctl; ; /定义在hd.c(P139第45行),硬盘分区表,一个硬盘最多可以分为4个区,每个分区用一个整数标识(次设备号) 0对应第一个硬盘 1、2、3、4对应第一个硬盘的四个

11、分区 5对应第二个硬盘 6、7、8、9对应第二个硬盘的四个分区,硬盘逻辑设备号,硬盘分区表,引导程序,第1分区表项,第2分区表项,第3分区表项,第4分区表项,0x55AA,主引导记录,分区表,引导标志,开始磁头号,开始扇区号,开始柱面号,分区类型,结束磁头号,结束扇区号,结束柱面号,起始物理扇区号,分区扇区数量,参见P149表6-8,0x1BE,分区数据结构,struct partition unsigned char boot_ind; unsigned char head; unsigned char sector; unsigned char cyl; unsigned char sys

12、_ind; unsigned char end_head; unsigned char end_sector; unsigned char end_cyl; unsigned int start_sect; /* starting sector counting from 0 */ unsigned int nr_sects; /* nr of sectors in partition */ ;,参见Hdreg.h(P400第52行),硬盘分区结构,static struct hd_struct long start_sect; long nr_sects; hd5*MAX_HD=0,0,;

13、/定义在hd.c(P140第56行),硬盘初始化,int sys_setup(void * BIOS) /定义在hd.c(P140第71行) 作用:通过读BIOS调用的结果来设置硬盘数据结 构。 参数:BIOS保存硬盘数据的内存块地址 该函数在main.c的init函数中(P66第172行)被调用,硬盘初始化,void hd_init(void) P146第343,硬盘操作的过程,向硬盘发送控制字节 等待控制器处于空闲状态 等待控制器处于准备状态 向控制器数据端口和命令端口发送参数和命令 等待中断 中断发生时检测处理结果(读状态控制器),并做其它处理,参见P149上,硬盘控制器端口,P146表

14、6-3,向硬盘控制器发送命令,static void hd_out( unsigned int drive, /硬盘号(0或1) unsigned int nsect, /扇区数量 unsigned int sect, /开始扇区 unsigned int head, /磁头号 unsigned int cyl, /柱面号 unsigned int cmd, /命令(P148表6-6) void (*intr_addr)(void) /中断实施的操作 /定义在hd.c(P143第180行),参考P148表6-7,中断操作,对于不同的命令,在中断中实施的操作也不同。Linux使用一个函数指针来记

15、录要实施的操作。 #define DEVICE_INTR do_hd /定义在blk.h(P135第81行) #ifdef DEVICE_INTR void (*DEVICE_INTR)(void) = NULL; #endif /定义在blk.h(P135第96行),对硬盘的操作,读硬盘 写硬盘,读硬盘,操作系统,硬盘控制器,发送命令,发送中断,发送中断,READY=1,从硬盘读数据,从硬盘读数据,从控制器的数据端口读数据,从控制器的数据端口读数据,写硬盘,操作系统,硬盘控制器,发送命令,DRQ=1,发送中断,发送中断,READY=1,写数据到硬盘,写数据到硬盘,向控制器的数据端口写数据,向

16、控制器的数据端口写数据,硬盘请求处理函数,void do_hd_request(void) /定义在hd.c(P145第294行) 作用:处理对于硬盘的请求,逻辑扇区号到CHS的转换,在request中保存的是要读扇区的逻辑扇区号,需要转换为磁道号(Cylinder)、磁头号(Head)和扇区号(Sector) 扇区是从0磁头0磁道1扇区开始编号(逻辑扇区号0)的,编完后再从1磁头0磁道1扇区开始编号。这样,把0磁道的扇区编完,再编1磁道。即按照磁道、磁头、扇区的顺序进行编号。,逻辑扇区号到CHS的转换,0磁道0磁头,0磁道1磁头,0柱面,1柱面,逻辑扇区号=C*(磁头数*每磁道扇区数)+H*每磁道扇区数+

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > PPT素材/模板

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号