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

上传人(卖家):三亚风情 文档编号:2775695 上传时间:2022-05-25 格式:PPT 页数:55 大小:468KB
下载 相关 举报
linux内核完全注释(课件)第六章.ppt_第1页
第1页 / 共55页
linux内核完全注释(课件)第六章.ppt_第2页
第2页 / 共55页
linux内核完全注释(课件)第六章.ppt_第3页
第3页 / 共55页
linux内核完全注释(课件)第六章.ppt_第4页
第4页 / 共55页
linux内核完全注释(课件)第六章.ppt_第5页
第5页 / 共55页
点击查看更多>>
资源描述

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对应第二个硬盘的四个分区硬盘逻辑设备号逻辑设

11、备号主设备号次设备号说明0 x30030第一块硬盘0 x3011第一块硬盘的第一个分区0 x3022第一块硬盘的第二个分区0 x3033第一块硬盘的第三个分区0 x3044第一块硬盘的第四个分区0 x3055第二块硬盘0 x3066第二块硬盘的第一个分区0 x3077第二块硬盘的第二个分区0 x3088第二块硬盘的第三个分区0 x3099第二块硬盘的第四个分区硬盘分区表引导程序第1分区表项第2分区表项第3分区表项第4分区表项0 x55AA主引导记录分区表引导标志开始磁头号开始扇区号开始柱面号分区类型结束磁头号结束扇区号结束柱面号起始物理扇区号分区扇区数量参见P149表6-80 x1BE分区数据

12、结构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 parti

13、tion */;参见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硬盘操作的过程1.向硬盘发送控制字节2.等待

14、控制器处于空闲状态3.等待控制器处于准备状态4.向控制器数据端口和命令端口发送参数和命令5.等待中断6.中断发生时检测处理结果(读状态控制器),并做其它处理参见P149上硬盘控制器端口I/O端口从端口读向端口写0 x1f0数据寄存器,512B0 x1f1错误寄存器(参见表6-4)写前预补偿寄存器0 x1f2扇区数寄存器0 x1f3扇区号寄存器0 x1f4柱面号寄存器0 x1f5柱面号寄存器0 x1f6驱动器/磁头寄存器 (101dhhhh d=驱动器号,h=磁头号)0 x1f7状态寄存器(参见表6-5)命令寄存器(参见表6-6)0 x3f6控制字节寄存器P146表6-3向硬盘控制器发送命令st

15、atic 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_INT

16、R do_hd/定义在blk.h(P135第81行)#ifdef DEVICE_INTRvoid (*DEVICE_INTR)(void) = NULL;#endif/定义在blk.h(P135第96行)对硬盘的操作读硬盘写硬盘读硬盘操作系统硬盘控制器发送命令发送中断发送中断READY=1从硬盘读数据从硬盘读数据从控制器的数据端口读数据从控制器的数据端口读数据写硬盘操作系统硬盘控制器发送命令DRQ=1发送中断发送中断READY=1写数据到硬盘写数据到硬盘向控制器的数据端口写数据向控制器的数据端口写数据硬盘请求处理函数void do_hd_request(void)/定义在hd.c(P145第2

17、94行)作用:处理对于硬盘的请求逻辑扇区号到CHS的转换在request中保存的是要读扇区的逻辑扇区号,需要转换为磁道号(Cylinder)、磁头号(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-1S=(逻辑扇区号 mod 每磁道扇区数) + 1H=逻辑扇区号/每磁道扇区数

18、mod 磁头数C=逻辑扇区号/每磁道扇区数 /磁头数逻辑扇区号到CHS的转换divl 操作数 把edx:eax组成的值除以操作数,商放在eax中,余数放在edx中1.edx=0; eax=逻辑扇区号结果 block=逻辑扇区号/每磁道扇区数 sec =逻辑扇区号%每磁道扇区数2.edx=0; eax=逻辑扇区号/每磁道扇区数结果 cyl =逻辑扇区号/每磁道扇区数/磁头数 head =逻辑扇区号/每磁道扇区数%磁头数硬盘中断void hd_interrupt(void);/定义在System_call.S(P89第221行)讲课内容设备管理简介硬盘驱动虚拟盘驱动根文件系统Linux引导启动时,

19、默认使用的文件系统是根文件系统。其中一般都包括这样一些子目录:/etc: 含有一些系统配置文件/dev:含有设备特殊文件/usr: 存放库函数、手册和其它一些文件/usr/bin:存放执行程序/bin:存放执行程序/var:存放系统运行时可变的数据或者是日志集成盘通常我们使用软盘启动Linux 0.11系统时需要两张盘:一张是内核引导启动盘,一张是基本的根文件系统盘。这样必须使用两张盘才能引导启动系统来正常运行一个基本的Linux系统,并且在运行过程中根文件系统盘必须一直保持在软盘驱动器中。 集成盘是指把内核引导启动盘和一个基本的根文件系统盘的内容合成制作在一张盘上。这样我们使用一张集成盘就能

20、引导启动Linux 0.11系统到命令提示符状态。 集成盘结构内核(120K)256257根文件系统引导块 超级块256K虚拟盘Linux中被访问的每个盘(硬盘或软盘)的第一个磁盘快必须为引导块,其后为超级块。在使用集成盘时,由于根文件系统放从第256磁盘块开始,它并不符合这个条件。在根文件系统加载的时候通过虚拟盘将其位置转换为统一访问标准。文件系统的超级块放在了虚拟盘的第一磁盘块(引导块)之后。集成盘结构内核(120K)256257根文件系统引导块 超级块256K虚拟盘256257根文件系统引导块 超级块虚拟盘逻辑设备号逻辑设备号主设备号次设备号说明0 x10111第一个虚拟盘0 x1022第二个虚拟盘0 x1033第三个虚拟盘0 x1044第四个虚拟盘0 x1055第五个虚拟盘0 x1066第六个虚拟盘0 x1077第七个虚拟盘虚拟盘初始化long rd_init(long mem_start, int length)/定义在ramdisk.c(P155第52行)作用:设置虚拟盘的开始地址、长度和请求 处理函数返回:虚拟盘的长度请求处理void do_rd_request(void)/定义在ramdisk.c(P154第23行)作用:处理虚拟盘读写请求

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(linux内核完全注释(课件)第六章.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|