第5章 Linux文件系统与设备文件系统

来源:互联网 发布:知识产权侵权 淘宝 编辑:程序博客网 时间:2024/05/23 12:05

本文摘自(偶有较小改动)《Linux 设备驱动开发详解》(宋宝华 编著;人民邮电出版社;),留作纪念。
——Living Park

5 Linux文件系统与设备文件系统

5.1 Linux文件操作

5.1.1 文件操作的相关系统调用

       涉及到的函数: creat; umask; open; read; write; lseek; close;

5.1.2 C库函数的文件操作

       fopen 打开模式Linux系统不区分二进制文件和文本文件

       fgetc;fputc; fgets; fputs; fprintf; fscanf; fread; fwrite; fgetpos; fsetpos; fseek;fclose;

5.2 Linux文件系统

5.2.1 Linux文件系统目录结构

       /proc 目录为伪文件系统proc的挂载目录,proc并不是真正的文件系统,它存在于内存之中。

       /sys Linux2.6内核所支持的sysfs文件系统被映射到此目录。

5.2.2 Linux文件系统与设备驱动

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

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

1.     file结构体。文件结构体代表一个打开的文件(设备对应于设备文件),系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结构。

文件读/写模式mode、标志f_flags都是设备驱动关心的内容,而私有数据指针private_data在设备驱动中被广泛应用,被指向设备驱动自定义用于描述设备的结构体。

2.     inode结构体。它是Linux管理文件体统的最基本单位,也是文件系统连接任何子目录、文件的桥梁。对于表示设备的inode结构,i_rdev字段包含设备编号。Linux 2.6 设备编号分为主设备编号和次设备编号,前者为dev_t的高12位,后者为dev_t的低20位。

5.3 devfs设备文件系统

       不需要为设备驱动程序分配主设备号以及处理次设备号,在程序中可以直接给register_chrdev()传递0主设备号以动态获得可用的主设备号,并在devfs_register()中指定次设备号。

5.4 udev设备文件系统

5.4.1 udevdevfs的区别

       udev完全在用户态工作,利用设备加入或移除时内核所发送的热插拔事件来工作。在热插拔时,设备的详细信息会由内核输出到位于/syssysfs文件系统。

       采用devfs,当一个并不存在的/dev节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。这是因为udev的设计者认为Linux应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。udev的设计者认为devfs所提供的打开/dev节点时自动加载驱动的功能对于一个配置正确的计算机是多余的。

5.4.2 sysfs文件系统与Linux设备模型

       Linux 2.6 内核引入了sysfs文件系统,改文件系统是一个虚拟的文件系统,它可以产生一个包括所有系统硬件的层级视图,与提供进程和状态信息的proc文件系统十分类似。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系。

5.4.3 udev的组成

       udev3个分割的子计划发展:namedevlibsysfsudev。在namedev中使用5个步骤来决定指定设备的命名。

5.4.4 udev规则文件

       udev规则文件以行为单位,以“#”开头的行代表注释行。其余的每一行代表一个规则。每个规则分成一个或多个匹配和赋值部分。

       可以借助udev中的udevinfo工具查找规则文件可以利用的信息。

5.4.5 创建和配置udev

       嵌入式系统中,只需要udevdudevstart就能使udev工作。

       生成配置udev

(1)   下载udev程序。(http://www.us.kernel.org/pub/linux/utils/kernel/hotplug)

(2)   解压缩udev程序包。

(3)   运行make编译,当前目录生成工具程序。

(4)   将工具程序复制到/sbin目录,同时将解压后获得的etc目录下的udev目录复制到系统的/etc下。


 

原创粉丝点击