- 1、本文档共160页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Linux设备管理讲义
第9章 设备管理与模块机制;9.1 Linux设备管理;Linux的设备管理 ;用户进程;设备文件
设备类型
[root@ edu]# more /proc/devices
主设备号与次设备号
[root@ edu/proc]#ls -1 /dev/had*
设备文件
在与设备驱动程序通信时,内核常常使用设备类型、主设备号和次设备号来标识一个具体的设备。
Linux将设备文件放在目录/dev或其子目录下 ;设备文件;设备文件;设备文件通常包含在/dev目录中
一些设备文件的例子;设备号;;申请字符设备的设备号;释放字符设备的设备号;申请和释放块设备设备号;查看硬件配置的相关命令;查看硬件配置的相关命令;查看硬件配置的相关命令;Linux设备的分类;Linux设备的分类(续);9.2 Linux设备管理数据结构;应用程序通常可以通过系统调用open()打开设备文件, 建立起与目标设备的连接。
对设备的使用类似于对文件的存取。
设备驱动程序都是系统内核的一部分, 它们必须为系统内核或者??们的子系统提供一个标准的接口。 设备驱动程序也使用一些标准的内核服务, 如内存分配等;;;;Devfs设备文件;
设备文件列表;Devfs设备文件;设备文件的VFS处理;2个重要的数据结构;设备文件: struct file数据结构;设备文件:i节点;;设备文件:操作;2个设备转换表;字符设备转换表(chrdevs);字符设备转换表(chrdevs);字符设备转换表的使用 ;字符设备转换表;(1) llseek(file, offset, whence):修改文件的读写指针。
(2) read(file, buf, count, offset):从设备文件的offset 处开始读出count个字节,然后增加offset的值。
(3) write(file, buf, count, offset):从设备文件的offset处写入count个字节,然后增加*offset的值。
(4) ioctl(inode, file, cmd, arg):向一个硬件设备发命令,对设备进行控制。
(5) mmap(file, vma):将设备空间映射到进程地址空间。
(6) open(inode, file):打开并初始化设备。
(7) release(inode, file):关闭设备并释放资源。
(8) fsync(file, dentry):实现内存与设备之间的同步通信。
(9) fasync(file, on):实现内存与设备之间的异步通信。;;字符设备的操作:打开文件操作
当打开字符设备文件时,使用设备的主设备号来索引chrdevs数组,得到文件操作函数指针。
建立起描述此字符设备文件的file结构,使其文件操作指针指向此设备驱动中的文件操作指针集合。
这样,所有应用对它进行的文件操作都被映射到此字符设备的文件操作集合上。
;注册与注销函数:
int register_chrdev(unsigned int major, const char * name, struct file_operations *fops) :chrdevs表最初为空,注册函数向表中插入一个新项
int unregister_chrdev(unsigned int major, const char * name);
注:major即设备的主设备号,注册后就是访问数组chrdevs的索引(下标)。
例:register_chrdev(6,”lp”,lp_fops):将并口打印机的相应驱动程序插入到chrdevs表中
;块设备转换表 ;blk_devs结构数组描述了一系列在系统中登记的块设备。
内容包括指向已登记的设备名的指针和指向block_device_operations结构的指针。
在block_device_operations结构中包含指向有关操作的函数指针。它们由设备驱动程序定义,并分别完成指定的设备操作
数组blk_devs也使用主设备号作为索引。;block_device_operations;块设备的注册与管理;除了文件操作接口外,块设备驱动程序还必须提供缓冲区接口。
块设备在内核中的数据结构比字符设备要复杂一些,主要是因为内核为块设备提供缓冲区高速缓存(buffer cache),实际的读写操作由缓冲区缓存协调调用,因此,还需要驱动程序为缓冲区缓存提供接口。;块设备请求;当系统中有进程发出一个读写块设备的请求时,内核会首先调用block_read()和block_write()对数据缓冲区进行读写。
当数据缓冲区不能满足用户进程的一个读写请求或者一个文件需要交换到物理磁盘上时,必须调用块设备的驱动程序来进行实际的数据传输。
为此,
文档评论(0)