第5章 Linux文件系统与设备文件
5.1 Linux文件操作
分为Linux文件操作系统调用和C库下的文件操作。这章介绍了一些读写的函数、权限等,标记一下。
5.2 Linux文件系统
5.2.1 Linux文件系统目录结构
进入Linux根目录(即“/”, Linux文件系统的入口,也是处于最高一级的目录),运行
“ls -l”命令,看到Linux包含以下目录。
1./bin
包含基本命令,如ls、cp、 mkdir等,这个目录中的文件都是可执行的。
2./sbin
包含系统命令,如modprobe、 hwclock、ifconfig等,大多是涉及系统管理的命令,这个
目录中的文件都是可执行的。
3./dev
设备文件存储目录,应用程序通过对这些文件的读写和控制以访问实际的设备
4./etc
系统配置文件的所在地,一些服务器的配置文件也在这里,如用户账号及密码配置文件。busybox的启动脚本也存放在该目录。
5./lib
系统库文件存放目录等。
6./mnt
/mnt 这个目录一般是用于存放挂载储存设备的挂载目录,比如含有cdrom等目录。可以
参看/etc/fstab的定义。有时我们可以让系统开机自动挂载文件系统,并把挂载点放在这里。
7./opt
opt是“可选”的意思,
有些软件包会被安装在这里。
8./proc
操作系统运行时,进程及内核信息(比如CPU、硬盘分区、内存信息等)存放在这里。/
proc目录为伪文件系统proc的挂载目录, proc并不是真正的文件系统,它存在于内存之中。
9./tmp
用户运行程序的时候,有时会产生临时文件,/tmp用来存放临时文件。
10./usr
这个是系统存放程序的目录,比如用户命令、用户库等。
11./var
var表示的是变化的意思,这个目录的内容经常变动,如/var 的/var/log目录被用来存放
系统日志。
12./sys
Linux 2.6以后的内核所支持的 sysfs文件系统被映射在此目录上。 Linux设备驱动模型中
的总线、驱动和设备都可以在 sysfs文件系统中找到对应的节点。当内核检测到在系统中出
现了新设备后,内核会在sysfs文件系统中为该新设备生成一项新的记录。
5.2.2 Linux文件系统与设备驱动
图5.1所示为Linux中虚拟文件系统、磁盘/Flash文件系统及一般的设备文件与设备驱动程序之间的关系。
应用程序和VFS之间的接口是系统调用,而VFS与文件系统以及设备文件之间的接口是 fle operations结构体成员函数,这个结构体包含对文件进行打开、关闭、读写、控制的一系列成员函数,关系如图5.2所示。
由于字符设备的上层没有类似于磁盘的 ext2等文件系统,所以字符设备的fleoperatio ns成员函数就直接由设备驱动提供了,在稍后的第6章,将会看到file_operations正是字符设备驱动的核心。块设备有两种访问方法,一种方法是不通过文件系统直接访问裸设备,在Linux内核实现了统一的 def_blk_fops这 一 file operations,它的源代码位于fs/block_dev.c,所以当我们运行类似于“ dd if/dev/sdl of-sdbl.img"的命令把整个/dev/sdbl裸分区复制到sdb1.img的时候,内核走的是 def_blk_fop这个 file operations;另外一种方法是通过文件系统来访问块设备,file operations的实现则位于文件系统内,文件系统会把针对文件的读写转换为针对块设备原始扇区的读写。ext2、fat、Btrfs等文件系统中会实现针对 VFS的file operations 成员的数,设备驱动层将看不到file operations 的存在。
这两张书里的图片,结构清晰,蛮不错的


后面就是介绍了file结构体和inode结构体。file结构体代表一个打开的文件,系统中每个打开的文件在内核空间都有一个关联的struct file。它由内核在打开文件时创建,并传递给在文件上进行操作的任何函数。在文件的所有实例都关闭后,内核释放这个数据结果。VFS inode包含文件访问权限、属主、组、大小、生成时间、访问时间、最后修改时间等信息。
5.3 devfs
5.4 udev用户空间设备管理
在Linux内核中,分别使用bus_type、device_driver、device结构体来描述总线、驱动和设备,这3个结构体定义于include/linux/device.h头文件中。bus_type结构体里定义了一个match();device_driver里定义了一个bus_type结构体,probe(),remove();device结构体也定义了一个bus_type结构体,还有一个device_driver(用于匹配哪个驱动设备)。
device driver 和 device分别表示驱动和设备,而这两者都必须依附于一种总线,因此都包含struct bus type指针。在Linux内核中,设备和驱动是分开注册的,注册1个设备的时候,并不需要驱动已经存在,而1个驱动被注册的时候,也不需要对应的设备已经被注册设备和驱动各自涌向内核,而每个设备和驱动涌入内核的时候,都会去寻找自己的另一半而正是bus_ type的match()成员函数将两者捆在一起简单地说,设备和驱动就是红尘中漂浮的男女,而bus type 的 match()则是牵引红线的月老,它可以识别什么设备与什么驱动是可配对的。一旦配对成功, xxx driver 的probe()就被执行(xxx是总线名,如 platform、pci、i2c、spi、 usb等)。
5.5 总结
Linux用户空间的文件编程有两种方法,即通过Linux API和通过C库函数访问文件。用户空间看不到设备驱动,能看到的只有与设备对应的文件,因此文件编程也就是用户空间的设备编程。
Linux按照功能对文件系统的目录结构进行了良好的规划。/dev是设备文件的存放目录,devfs 和udev分别是Linux2.4和Linux2.6以后的内核生成设备文件节点的方法,前者运行于内核空间,后者运行于用户空间。
Linux 2.6以后的内核通过一系列数据结构定义了设备模型,设备模型与sysfs文件系统中的目录和文件存在一种对应关系。设备和驱动分离,并通过总线进行匹配。
udev可以利用内核通过 netlink发出的uevent信息动态创建设备文件节点。
上述总结是书中总结,我自己的总结是这张udev后面的内容我看不是很明白,贴了很多代码,后续再来回顾吧
648

被折叠的 条评论
为什么被折叠?



