国防科大OS10-4章节

上传人:E**** 文档编号:91485323 上传时间:2019-06-28 格式:PPT 页数:17 大小:232KB
返回 下载 相关 举报
国防科大OS10-4章节_第1页
第1页 / 共17页
国防科大OS10-4章节_第2页
第2页 / 共17页
国防科大OS10-4章节_第3页
第3页 / 共17页
国防科大OS10-4章节_第4页
第4页 / 共17页
国防科大OS10-4章节_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《国防科大OS10-4章节》由会员分享,可在线阅读,更多相关《国防科大OS10-4章节(17页珍藏版)》请在金锄头文库上搜索。

1、10.4 设备管理,内容 设备文件 设备管理相关数据结构 块设备文件的open()、read()操作,10.4.1 设备文件的概念 传统的Unix系统均把设备当成文件来处理,因而可以用read()/write()对设备进行操作。设备文件一般在/dev目录下。 Linux下的设备大体分为三类: (1)块设备: 一次I/O操作以固定大小的数据块为单位,且可随机存取。 (2)字符设备:一次I/O操作存取数据量不固定,只能顺序存取。 (3)网卡:网卡是特殊处理的,它没有对应的设备文件。,设备文件的属性 文件名:如 hda1 类型:是字符设备还是块设备 主设备号:主设备号相同的设备被同一设备驱动程序处理

2、。 从设备号:用来指明具体的设备 mknod()创建设备文件,它的参数是上面提到的四个属性。 Linux安装完成之后已经在/dev目录下生成了绝大多数可能要用到的设备文件,10.4.2 相关数据结构 VFS与设备驱动程序接口:,name,fops,blkdevs(块设备)driver操作表 chrdevs(字符设备)driver操作表,name,fops,dentry,Files_ operations,inode,Inode_ operations,fd_array,file,files_struct,task_struct,一、 字符设备管理 字符设备管理的主要数据结构如下: struct

3、 device_struct const char * name; struct file_operations * fops; ; static struct device_struct chrdevsMAX_CHRDEV; 全局数组chrdevs记录了所有字符设备驱动程序的名称name及其对应的设备操作函数接口fops。数组的下标,则对应于设备的主设备号。,加载设备驱动时,设备在系统中的注册是通过函数register_chrdev( ),其原型如下: int register_chrdev(unsigned int major, const char * name, struct file

4、_operations *fops); 不同的字符设备驱动程序要提供不同的file_operations实现。 当设备不再使用时,可以通过unregister_chrdev()函数注销。,二、 块设备管理 主要数据结构有blkdevs和blk_dev: static struct const char *name; struct block_device_operations *bdops;/* 特定于设 备的操作集*/ blkdevsMAX_BLKDEV; struct blk_dev_struct request_queue_t request_queue;/*请求队列*/ queue_p

5、roc *queue; void *data; ; struct blk_dev_struct blk_devMAX_BLKDEV; 数组的下标对应设备驱动程序的主设备号, blkdevs 记录设备文件名及相应的操作集合, blk_dev 记录各个设备的请求队列。,Request_fn,Buffer head,Buffer head,Buffer head,相关数据结构 blk_dev,blk_dev_struct request request,内存 外存,三 、 buffer cache 块设备的操作是以块为基本单位,一般情 况块的大小不会超过页面的大小。 buffer cache 是对物

6、理磁盘块的缓冲, 一个buffer的大小等同于一个块的大小 buffer cache目的:提高性能。 每个buffer由buffer_head结构描述,内核根据buffer_head的状态信息操作buffer,struct buffer_head struct buffer_head *b_next; /* 用来链接hash值相同 的buffer_head */ unsigned long b_blocknr; /* 块号 */ unsigned short b_size; /* 块的大小 */ kdev_t b_dev; kdev_t b_rdev; /* 设备号 */ struct buf

7、fer_head *b_this_page;/* 同属一个页面的 buffer 链表 */ struct buffer_head *b_reqnext; /* 同一个操作请求 的buffer_head链表*/ struct buffer_head *b_pprev; /* 用来链接hash值相 同的buffer_head */ char * b_data; /*buffer所在的位置 */ struct page *b_page; /* buffer所属的页面 */ wait_queue_head_t b_wait; /*进程等待队列*/ struct inode * b_inode;/*该b

8、uffer所属的inode结构*/ ;,每个buffer由设备号和块号唯一确定,并以两者为hash关键字在buffer cache定位。 通常块的大小为1KB,而物理页帧的大小为4KB,所以一个物理页帧可以容纳4个buffer,page cache和buffer cache的区别 (1)buffer cache用于读取文件系统分区和文件的元数据。 (2)page cache主要用来存放常规文件的数据,数据也并不一定在物理上连续。 (3)page cache尽量不与buffer cache存放相同数据。,四、 设备请求队列 每类块设备都维护一个请求队列 队列的每一个成员称之为操作请求。 stru

9、ct request int cmd; /* 操作行为:读或写 */ struct buffer_head * bh; /*buffer_head链表*/ struct buffer_head * bhtail; ;,每个操作请求都维护着一个buffer_head链表。每当需要对一个块进行操作时要将相应的buffer_head加入设备请求队列,这个过程有两个优化措施: 能否合并。检查已有的块设备操作请求中的块和现在操作的块是否在物理上相邻并且操作行为一致 (2)如果不能合并的话则生成一个新的块设备操作请求,并加入相应设备请求队列的合适位置, 使磁头的移动路径尽可能短。,10.4.3 块设备文件

10、的open()、read()操作 可以把块设备整体看成一个文件来访问 一、 块设备驱动程序组成 块设备驱动程序分为两部分: (1)与VFS的接口层。blkdevs (2)真正对设备(一般是磁盘控制器)操作的部分,如 blk_devmajor.request_fn。,二、 open()函数 打开一个设备文件与打开一个普通文件不同的特殊处理(以原来的设备文件方式为例) 在VFS处理open系统调用时,会调用对应文件系统的super_operations中的read_inode方法将设备文件inode读入内存; 当得知是设备文件时,会将file中的f_op域置为def_blk_fops/def_ch

11、r_fops表地址,其中有blkdev_open()/chrdev_open()操作; 然后会调file中f_op域指向的操作表的open方法。,以blkdev_open()为例: 得到主设备号; filp-f_op=blkdevsmajorfops #用blkdevs 表中的对应操作表地址重填file的f_op域; 调filp-f_op-open(). 设备driver的open()函数主要工作: 如果driver是动态加载模块,使用计数1; 检查设备是否存在; 如有必要,初始化设备; 初始化设备的数据结构(如登记中断服务程序等)。,三、 read()函数 块设备将调用block_read()函数。 (在版本2.4中block_write/read变成了generic_file_write/read,它先访问page cache.) block_read()函数首先计算出要读出的块。 对于要读的每一块,首先检查buffer cache是否已经存在,存在则返回。 若不存在则申请一个buffer并将相应的buffer_head加入对应设备的请求队列,然后进程进入buffer head的等待队列睡眠。 操作请求将在合适的时候被触发,驱动程序完成读操作后将操作请求移出请求队列,进程被唤醒把buffer中的数据读到自己的缓冲区。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

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