- 作者: 陈孝松
- 主页: chenxiaosong.com
- 哔哩哔哩教学视频: 陈孝松
- 课程: chenxiaosong.com/courses
- 博客: chenxiaosong.com/blog
- 贡献: chenxiaosong.com/contributions
- 邮箱: chenxiaosong@chenxiaosong.com
- QQ交流群: 544216206, 点击查看群介绍
一般的Linux书籍都是先讲解进程和内存相关的知识,但我想先讲解文件系统。
第一,因为我就是做文件系统的,更擅长这一块,其他模块的内容我还要再去好好看看书,毕竟不能误人子弟嘛;第二,是
因为文件系统模块更接近于用户态,是相对比较好理解的内容(当然想深入还是要下大功夫的),由文件系统入手比较适合初学者。
英文全称Extended file system,翻译为扩展文件系统。Linux内核最开始用的是minix文件系统,直到1992年4月,Rémy Card开发了ext文件系统,采用Unix文件系统(UFS)的元数据结构,在linux内核0.96c版中引入。设计上参考了BSD的快速文件系统(Fast File System,简称FFS)。1993年1月0.99版本中ext2合入内核, 2001年11月2.4.15版本中ext3合入内核,2006年10月10日2.6.19版本中ext4合入内核。
相关文档网站:
创建索引节点 ext2_new_inode()
,删除索引节点 ext2_free_inode()
。
当块大小为1024
字节时,命令echo -n something | dd of=file bs=1 seek=4098
创建一个有“洞”的文件,索引节点的i_size
值为4099
,但i_blocks
的值为2,因为只占用1个块,1个块1024
字节,以512
为单位的i_blocks
的值为2。i_block[]
数组前4个元素值为0,第五个元素存放块号。
分配数据块调用ext2_get_block() -> ext2_alloc_blocks() -> ext2_new_blocks()
,释放数据块调用ext2_free_blocks()
。
再讲一下数据块寻址,inode
的i_block[]
数组默认有15个元素,每个元素4字节,前12个直接指向存放数据的逻辑块(对应的文件块号是0~11
)。第13个元素指向的是间接块,这个间接块上存了一个bsize/4
个元素的数组(其中bsize
表示块大小),对应的文件块号为12~(11+bsize/4)
。第14个元素指向二级间接块,第15个元素指向三级间接块。
ext2不经过页缓存直接写调用ext2_file_write_iter() -> ext2_dio_write_iter()
, 经过缓存写调用ext2_file_write_iter() -> generic_file_write_iter()
。