下面列出主要的文件系统数据结构,便于查询,主要参见include/linux/fs
h一、超级块(超辑块是与设备一一对应的)超级块数组(在内存中)01234567{节点数逻辑块数i节点所占用的数据块数逻辑块位图所占用的数据块数用于磁盘与内存第一个数据逻辑块号log2(数据块数/逻辑块)文件最大长度文件系统幻数-----------------------------------------------------------------------------------------i节点位图缓冲区指针数组逻辑块位图缓冲区指针数组超级块所在的设备号被安装的文件系统根目录的i节点被安装到的i节点仅用于内存修改时间等待该超级块的进程被锁定标志只读标志已修改(脏)标志}超级块(在磁盘上)二、缓冲区散列队列(缓冲区是与盘块一一对应的)下面给出赵博画的缓冲区的散列队列逻辑示意图以上散列项,free_list与缓冲头均为buffer_head结构{指向1024个字节数据块的指针块号数据源的设备号更新标志:表示数据是否已更新修改(脏)标志使用的用户数缓冲区是否被锁定等待该缓冲区解锁的任务hash队列上前一块hash队列上后一块空闲表上前一块空闲表上后一块}在 Linux0
11内核中具体实现时,在物理内存中缓冲区的状态如下:free_list01……306hash_table以上实线箭头为data指针,一个缓冲头指向一个大小为1KB的缓冲区,虚线是空闲链表指针,构成双向链表,初始化时是相邻的缓冲头链接成空闲表,位于内核模块的structbuffer_head*型数组经哈希函数计算后指向缓冲头结构,初始化时为全NULL
哈希函数=(设备号 异或 块号) 取余 307,307为哈希表长
hash_table在实际运行后的图参见前面的缓冲区的散列队列逻辑示意图
start_bufferbuff