现在的位置: 首页 > 综合 > 正文

Linux设备驱动开发详解–笔记5–Linux文件与设备系统

2013年07月11日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭

应用程序和VFS之间的接口是系统调用,而VFS与磁盘文件系统以及普通设备之间的接口是file_operations结构体成员函数。由于字符设备的上层没有磁盘文件系统,所以字符设备的file_operations成员函数直接由设备驱动提供了,file_operations正是字符设备驱动的核心,如图:

 

而对块设备来说,ext2、fat、jffs2等文件系统中会实现针对VFS的file_operations成员函数,设备驱动层将看不到file_operations的存在。磁盘文件系统和设备驱动会将对磁盘上文件的访问最终转换成对磁盘上柱面和扇区的访问

 

在设备驱动程序的设计中,一般而言,会关心结构体file和inode这个两个结构体

 

一个file结构体实例对应一个打开的文件,file结构体中的f_mode(文件读写模式)、f_flags(标志)都是设备驱动关心的,而私有数据指针private_data在设备驱动中被广泛应用,大多指向设备驱动自定义用于描述设备的结构体

 

inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。是Linux管理文件系统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。

其中的i_rdev字段的高12位为是主设备号,后20位为次设备号

 

Devfs(设备文件系统)优点:

1、可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载时将它删除

2、设备驱动程序可以指定设备名、所有者、权限位,用户空间程序仍可以修改所有者和权限位

3、在程序中可以直接给register_chrdev()传递0主设备号以动态获得可用的主设备号,并在devfs_register()中指定次设备号

 

在Linux2.4的设备驱动编程中,分别在模块加载和卸载函数中创建和撤销设备文件是被普遍采用并值得大力推荐的好方法:register_chrdev(……)-->devfs_register(……)--> devfs_unregister(……)--> unregister_chrdev(……)

 

Linux2.6中udev取代了devfs

Udev完全工作在用户态,利用设备加入或移除时内核锁发送的热插拔事件来工作,在热插拔式,设备的详细信息会由内核输出到/sys的sysfs文件系统

 

Linux2.6内核引入了sysfs文件系统,sysfs被看成是与proc、devfs、devpty同类的文件系统,该文件系统式一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分相似

Sysfs的一个目的就是展示设备驱动模型中各组件的层次关系

 

在/sys/bus的pci等子目录下,有会分出drivers和devices目录,而devices目录中的文件时对/sys/devices目录中文件的符号链接。同样的,在/sys/class目录下包含许多对/sys/devices下文件的链接。这与设备、驱动、总线和类的现实状况是直接对应的,也正符合2.6内核的设备模型,如图:

抱歉!评论已关闭.