Linux操作系统-设备管理.ppt

上传人:牧羊曲112 文档编号:5438017 上传时间:2023-07-07 格式:PPT 页数:17 大小:266.49KB
返回 下载 相关 举报
Linux操作系统-设备管理.ppt_第1页
第1页 / 共17页
Linux操作系统-设备管理.ppt_第2页
第2页 / 共17页
Linux操作系统-设备管理.ppt_第3页
第3页 / 共17页
Linux操作系统-设备管理.ppt_第4页
第4页 / 共17页
Linux操作系统-设备管理.ppt_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《Linux操作系统-设备管理.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统-设备管理.ppt(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 device_struct

3、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_operations*fops);不同的字符设备驱动程序要

4、提供不同的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_proc*queue;void*data;struct blk_dev_struct b

5、lk_devMAX_BLKDEV;数组的下标对应设备驱动程序的主设备号,blkdevs 记录设备文件名及相应的操作集合,blk_dev 记录各个设备的请求队列。,Request_fn,Buffer head,Buffer head,Buffer head,相关数据结构blk_dev,blk_dev_struct requestrequest,内存外存,三、buffer cache 块设备的操作是以块为基本单位,一般情 况块的大小不会超过页面的大小。buffer cache 是对物理磁盘块的缓冲,一个buffer的大小等同于一个块的大小 buffer cache目的:提高性能。每个buffer由

6、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 buffer_head*b_this_page;/*同属一个页面的 buffer 链表*/struct buffer_head*b_reqnext;/*同一个操作

7、请求 的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;/*该buffer所属的inode结构*/.;,每个buffer由设备号和块号唯一确定,并以两者为hash关键字在buffer cache定位。通常块的大小为1KB,而物理页帧的大小为4KB,所以一个物理页帧可以容纳4

8、个buffer,page cache和buffer cache的区别(1)buffer cache用于读取文件系统分区和文件的元数据。(2)page cache主要用来存放常规文件的数据,数据也并不一定在物理上连续。(3)page cache尽量不与buffer cache存放相同数据。,四、设备请求队列每类块设备都维护一个请求队列队列的每一个成员称之为操作请求。struct request int cmd;/*操作行为:读或写*/struct buffer_head*bh;/*buffer_head链表*/struct buffer_head*bhtail;.;,每个操作请求都维护着一个bu

9、ffer_head链表。每当需要对一个块进行操作时要将相应的buffer_head加入设备请求队列,这个过程有两个优化措施:能否合并。检查已有的块设备操作请求中的块和现在操作的块是否在物理上相邻并且操作行为一致(2)如果不能合并的话则生成一个新的块设备操作请求,并加入相应设备请求队列的合适位置,使磁头的移动路径尽可能短。,10.4.3 块设备文件的open()、read()操作 可以把块设备整体看成一个文件来访问一、块设备驱动程序组成块设备驱动程序分为两部分:(1)与VFS的接口层。blkdevs(2)真正对设备(一般是磁盘控制器)操作的部分,如 blk_devmajor.request_fn

10、。,二、open()函数打开一个设备文件与打开一个普通文件不同的特殊处理(以原来的设备文件方式为例)在VFS处理open系统调用时,会调用对应文件系统的super_operations中的read_inode方法将设备文件inode读入内存;当得知是设备文件时,会将file中的f_op域置为def_blk_fops/def_chr_fops表地址,其中有blkdev_open()/chrdev_open()操作;然后会调file中f_op域指向的操作表的open方法。,以blkdev_open()为例:得到主设备号;filp-f_op=blkdevsmajorfops#用blkdevs 表中的

11、对应操作表地址重填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备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号