linux内核完全注释(课件)第六章

上传人:小**** 文档编号:246726768 上传时间:2024-10-15 格式:PPT 页数:55 大小:468KB
返回 下载 相关 举报
linux内核完全注释(课件)第六章_第1页
第1页 / 共55页
linux内核完全注释(课件)第六章_第2页
第2页 / 共55页
linux内核完全注释(课件)第六章_第3页
第3页 / 共55页
点击查看更多>>
资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,Linux,操作系统内核分析,湘潭大学信息工程学院,讲课内容,设备管理简介,硬盘驱动,虚拟盘驱动,块设备的操作方式,P132,图,6-2,设备管理模块读处理过程,进程向缓冲区模块提出读块(,2,扇区)请求。,缓冲区模块检查该块是否已经被缓冲。如果已经被缓冲,则直接返回缓冲的块;否则,向设备管理模块提出读请求。,设备管理模块接受请求。如果设备不忙,则向设备发送命令;否则,把请求插入到设备的请求队列中。,缓冲区模块挂起进程。,设备控制器从设备中读入数据到自己的缓冲区中,并产生中断。,设备中断处理程序把数据从控制器缓冲区读到内存缓冲区,然后唤醒进程。,P248,第,267,设备管理模块写处理过程,缓冲区模块决定要回写被缓冲的块。如果该块是脏的,向设备管理模块提出写请求。,设备管理模块接受请求。如果设备不忙,则向设备发送命令和数据;否则,把请求插入到设备的请求队列中。,缓冲区模块挂起进程。,设备控制器把数据写入到设备并产生中断。,设备中断处理程序唤醒进程。,低级读写流程,根据缓冲区头,创建一个请求,队列中没有请求,把请求插入到设,备的请求队列中,向设备发送命令,是,否,说明设备空闲,设备号,设备是通过主设备号和次设备号,(,两者构成了,物理设备号,),来进行区分的,主设备号,:,区分不同类型的设备,(P131,表,6-2),次设备号,:,区分相同类型设备中的个体,逻辑设备号,用于区分不同的设备,逻辑设备号,=,主设备号,8),#define,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_head,*,bh,; /,缓冲区头指针,struct,request * next; /,同一设备的下一个请求项,;,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,(,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_interrupt,floppy_interrupt,初始化模块,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,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,柱面的处理请求会饿死。,电梯算法改进,5 7,5 7,2,5,6,7,2,5 6,7,1,2,5 6 7 1 2,8,对于请求,Q,,如果队列中存在,A1,和,A2,,,1,、满足,A1,Q,A2,,则把,Q,插入到,A1,和,A2,中,2,、满足,Q,A2,cmd,cmd,| (s1)-,cmd,=(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),tmp,req,next,req,next ,tmp,ll_rw_block,根据缓冲区头,创建一个请求,队列中没有请求,把请求插入到设,备的请求队列中,向设备发送命令,是,否,说明设备空闲,make_request,P150,图,6-4,讲课内容,设备管理简介,硬盘驱动,虚拟盘驱动,硬盘分类,按照接口分,硬盘可以分为,IDE,(,ATA,)硬盘,SCSI,硬盘,FC,硬盘,SATA,硬盘,硬盘内部结构,硬盘参数表,在,setup.s,中,,Linux,通过,BIOS,调用读取了硬盘的参数,并保存在物理地址,0x90080,处(第,1,块硬盘)和物理地址,0x90090,处(第,2,块硬盘)。,(,参见,P44,表,3-3),硬盘参数表,位移,大小,说明,0x00,2B,柱面数,0x02,1B,磁头数,0x03,2B,AT,硬盘为,0,0x05,2B,写前预补偿柱面号*,4,0x07,1B,AT,硬盘为,0,0x08,1B,控制字节,位,0,未用 位,4,未用,位,1,保留(,0,) 位,5,有坏区图则置,1,位,2,允许复位 位,6,禁止,ECC,重试,位,3,若磁头数大于,8,则为,1,,否则为,0,位,7,禁止访问重试,0x09,1B,AT,硬盘为,0,0x0A,1B,AT,硬盘为,0,0x0B,1B,AT,硬盘为,0,0x0C,2B,磁头着陆柱面号,0x0E,1B,每磁道扇区数,0x0F,1B,保留,硬盘结构,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,对应第二个硬盘的四个分区,硬盘逻辑设备号,逻辑设备号,主设备号,次设备号,说明,0x300,3,0,第一块硬盘,0x301,1,第一块硬盘的第一个分区,0x302,2,第一块硬盘的第二个分区,0x303,3,第一块硬盘的第三个分区,0x304,4,第一块硬盘的第四个分区,0x305,5,第二块硬盘,0x306,6,第二块硬盘的第一个分区,0x307,7,第二块硬盘的第二个分区,0x308,8,第二块硬盘的第三个分区,0x309,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_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,;,/,定义在,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,上,硬盘控制器端口,I/O,端口,从端口读,向端口写,0x1f0,数据寄存器,,512B,0x1f1,错误寄存器(参见表,6-4,),写前预补偿寄存器,0x1f2,扇区数寄存器,0x1f3,扇区号寄存器,0x1f4,柱面号寄存器,0x1f5,柱面号寄存器,0x1f6,驱动器,/,磁头寄存器,(101dhhhh d=,驱动器号,,h=,磁头号,),0x1f7,状态寄存器(参见表,6-5,),命令寄存器(参见表,6-6,),0x3f6,控制字节寄存器,P146,表,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,使用一个函数指针来记录要实施的操作。,#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,写数据到硬盘,写数据到硬盘,向控制器的数据端口写数据,向控制器的数据端口写数据,硬盘请求处理函数,void,do_hd_request(void,),/,定义在,hd.c,(,P145,第,294,行),作用:处理对于硬盘的请求,逻辑扇区号到,CHS,的转换,在,request,中保存的是要读扇区的逻辑扇区号,需要转换为磁道号,(C,ylinder,),、磁头号,(Head),和扇区号,(Sector),扇区是从,0,磁头,0,磁道,1,扇区开始编号,(,逻辑扇区号,0),的,编完后再从,1,磁头,0,磁道,1,扇区开始编号。这样,把,0,磁道的扇区编完,再编,1,磁道。即按照磁道、磁头、扇区的顺序进行编号。,逻辑扇区号到,CHS,的转换,0,磁道,0,磁头,0,磁道,1,磁头,0,柱面,1,柱面,逻辑扇区号,=C*(,磁头数*每磁道扇区数,)+H*,每磁道扇区数,+S-1,=,(C*,磁头数,+H)*,每磁道扇区数,+S-1,S=(,逻辑扇区号,mod,每磁道扇区数,) + 1,H=,逻辑扇区号,/,每磁道扇区数,mod,磁头数,C=,逻辑扇区号,/,每磁道扇区数,/,磁头数,逻辑扇区号到,CHS,的转换,divl,操作数,把,edx:eax,组成的值除以操作数,商放在,eax,中,余数放在,edx,中,edx,=0;,eax,=,逻辑扇区号,结果,block=,逻辑扇区号,/,每磁道扇区数,sec =,逻辑扇区号,%,每磁道扇区数,edx,=0;,eax,=,逻辑扇区号,/,每磁道扇区数,结果,cyl,=,逻辑扇区号,/,每磁道扇区数,/,磁头数,head =,逻辑扇区号,/,每磁道扇区数,%,磁头数,硬盘中断,void,hd_interrupt(void,);,/,定义在,System_call.S,(,P89,第,221,行),讲课内容,设备管理简介,硬盘驱动,虚拟盘驱动,根文件系统,Linux,引导启动时,默认使用的文件系统是根文件系统。其中一般都包括这样一些子目录:,/etc,: 含有一些系统配置文件,/dev,:含有设备特殊文件,/,usr,: 存放库函数、手册和其它一些文件,/,usr,/bin,:存放执行程序,/bin,:存放执行程序,/,var,:存放系统运行时可变的数据或者是日志,集成盘,通常我们使用软盘启动,Linux 0.11,系统时需要两张盘:一张是内核引导启动盘,一张是基本的根文件系统盘。这样必须使用两张盘才能引导启动系统来正常运行一个基本的,Linux,系统,并且在运行过程中根文件系统盘必须一直保持在软盘驱动器中。,集成盘是指把内核引导启动盘和一个基本的根文件系统盘的内容合成制作在一张盘上。这样我们使用一张集成盘就能引导启动,Linux 0.11,系统到命令提示符状态。,集成盘结构,内核,(120K),256,257,根文件系统,引导块,超级块,256K,虚拟盘,Linux,中被访问的每个盘(硬盘或软盘)的第一个磁盘快必须为引导块,其后为超级块。在使用集成盘时,由于根文件系统放从第,256,磁盘块开始,它并不符合这个条件。,在根文件系统加载的时候通过虚拟盘将其位置转换为统一访问标准。文件系统的超级块放在了虚拟盘的第一磁盘块(引导块)之后。,集成盘结构,内核,(120K),256,257,根文件系统,引导块,超级块,256K,虚拟盘,256,257,根文件系统,引导块,超级块,虚拟盘逻辑设备号,逻辑设备号,主设备号,次设备号,说明,0x101,1,1,第一个虚拟盘,0x102,2,第二个虚拟盘,0x103,3,第三个虚拟盘,0x104,4,第四个虚拟盘,0x105,5,第五个虚拟盘,0x106,6,第六个虚拟盘,0x107,7,第七个虚拟盘,虚拟盘初始化,long,rd_init(long,mem_start,int,length),/,定义在,ramdisk.c,(,P155,第,52,行),作用:设置虚拟盘的开始地址、长度和请求 处理函数,返回:虚拟盘的长度,请求处理,void,do_rd_request(void,),/,定义在,ramdisk.c,(,P154,第,23,行),作用:处理虚拟盘读写请求,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!