文章目录
- 一.内存中的文件管理(文件与进程)
- 二 .Linux系统视角下的计算机外设
- 三.磁盘上的文件管理
参考Linux内核源码版本------linux-2.4.3
一.内存中的文件管理(文件与进程)
- 操作系统之下,进程是计算机系统执行计算任务的基本单位,进程访问文件执行数据读写之前,操作系统会从外设获取相应的文件信息,在内存中建立
struct file
结构体对象来描述和管理文件,进程借助struct file
结构体提供的文件信息执行文件操作. - 进程PCB
struct task_struct
与文件struct file
之间的关联:
- Linux系统下,打开文件的系统调用接口:
int open(const char *pathname, int flags, mode_t mode);
- 接口的返回值其实是
fd_array
列表中的元素数组下标,称为文件描述符,通过数组下标和fd_array
列表,可以找到指定文件的struct file
对象
- Linux系统下,文件重定向接口:
int dup2(int oldfd, int newfd);
dup2
接口原理:先关闭fd_array[newfd]
指向的文件,然后在fd_array
列表中,指针fd_array[oldfd]
覆盖掉指针fd_array[newfd]
,后续使用oldfd
和newfd
执行文件操作,操作的便是同一个文件。- 进程替换不会影响进程
PCB
的大部分内容(包括struct file
结构体),因此文件重定向在执行进程替换之后仍然生效.
二 .Linux系统视角下的计算机外设
- 操作系统之下,计算机外设与计算机内存之间的交互必须依托于进程
- 冯诺依曼计算机除了内存和CPU外,其他的与计算机内存进行交互的IO设备在Linux系统中统一被视为被进程打开的文件。
- 与其他被进程打开的文件相同,工作中的IO设备在Linux内核中被统一描述为
struct file
结构体对象,不同的具体IO设备的struct file
对象中的成员函数指针会指向不同的接口实现:
- 不同的IO设备对应的
struct file
中的函数指针指向不同的接口实现,这本质上就是C语言的多态编程,“Linux下一切皆文件”其实就是在Linux系统内核中体现的最早期的多态编程,这种编程模式在Linux内核中被频繁使用 (面向对象编程语言的始祖)
三.磁盘上的文件管理
- Linux系统视角下,磁盘空间在呈线性排列,一个磁盘被分为多个分区,每个分区由多个块组构成,块组的结构如下:
- 块组的组成部分:
SuperBlock
(超级块):包含的是整个文件系统的全局信息,比如inode
总个数、块总个数、每个块组的inode
个数、每个块组的块个数等等。SuperBlock
的存在意义是备份文件系统的重要全局信息,保证文件系统的安全性和稳定性GroupDescriptorTable
(块组描述符):包含文件系统中所有块组的属性信息,与SuperBlock
的作用类似。BlockBitmap
(数据位图)和inodeBitmap
(inode
位图): 用于标识对应的数据块或inode
是空闲的,还是正在被使用中。inodeTable
(inode
列表):包含了块组中所有的inode
,inode
与磁盘文件是一一对应的关系,inode
中存储磁盘文件的文件信息和文件的数据块引索Data blocks
(数据块):存储文件的有效数据.