24小时学通Linux内核之有关Linux文件系统实现的问题

💡 原文中文,约6800字,阅读约需17分钟。
📝

内容提要

Linux的虚拟文件系统是Linux的重要特性,支持多种文件系统。它由全局变量和其他结构组成,与VFS相互作用。页缓冲是Linux中的核心概念,使用address_space对象管理内存中的页。buffer_head结构表示块设备上的每个扇区。VFS系统调用包括open()、close()、read()和write()等函数。

🔎

延伸解读

VFS 全局结构的管理方式

文章指出,VFS 通过全局变量和链表来管理核心结构,如 super_block、dentry、inode 等。这些结构分别保存在自己的链表中,索引结点可在全局的 inode_in_use 或 inode_unused 上找到,也可能位于对应超级块的局部链表中。这种设计使得 VFS 能够统一表示和操作多种不同的文件系统,是 Linux 支持多文件系统的基础机制。

进程与文件系统的关联结构

fs_struct 和 files_struct 是进程与文件系统交互的关键结构。fs_struct 可被多个进程描述符引用,保存了根目录、当前工作目录及权限掩码等信息;files_struct 则管理打开文件描述符的集合,包括最大文件数、下一个可用描述符以及打开文件对象数组。文章通过代码展示了这些结构的字段,并说明 INIT_FILES 宏用于初始化 files_struct。

页缓冲与 buffer_head 的角色

页缓冲是 Linux 内存管理中的核心概念,通过 address_space 对象管理内存中的页。文章提到,内存被分成区,每个区拥有活跃页和不活跃页链表,不活跃页会被写回磁盘。此外,块设备上的每个扇区由 buffer_head 结构表示,它关联了逻辑块号、物理内存数据块及所在物理页,是连接物理内存与块设备逻辑块的重要桥梁。

VFS 系统调用的实际行为

文章详细介绍了 open、close、read、write 四个系统调用的用法和返回值。open 用于打开或创建文件,返回文件描述符;close 释放描述符,进程终止时内核会自动关闭未关闭的文件。read 和 write 分别从文件读取和写入数据,返回实际操作的字节数。文章还指出,read 可能因文件末尾、终端设备、网络缓存等原因返回小于请求的字节数。

❓

Q&A

Linux虚拟文件系统(VFS)的主要作用是什么?

VFS是Linux的一个重要特性,它支持多种不同的文件系统,并依赖数据结构来保存对文件系统的一般表示。

fs_struct结构体包含哪些字段?

fs_struct结构体包含count(引用计数)、lock(读写锁)、umask(文件权限掩码)、root、pwd、altroot(目录项指针)以及rootmnt、pwdmnt、altrootmnt(vfsmount指针)。

files_struct结构体中的max_fds和max_fdset分别表示什么?

max_fds表示进程能够打开的文件的最大数,max_fdset表示描述符的最大数。

Linux页缓冲的核心是什么?它如何管理内存中的页?

页缓冲的核心是address_space对象,它用于管理内存中的页。

buffer_head结构体在Linux内核中代表什么?

buffer_head结构体表示块设备上的每个扇区,它管理物理内存和逻辑块。

open()函数在什么情况下需要第三个参数?

open()函数的第三个参数仅当创建新文件时才使用,用于指定文件的访问权限位。

read()函数返回的字节数小于count的可能原因有哪些?

可能原因包括:读取普通文件时读到文件末尾;从终端设备读取时通常只能读取一行;从网络读取时网络缓存可能导致字节数不足;读取pipe或FIFO时字节数可能小于count;从面向记录的设备读取时每次最多返回一个记录;在读取部分数据时被信号中断。

🏷️

标签

➡️

继续阅读