读书人

Linux那些事情 之 ext4文件系统(0) 引

发布时间: 2012-09-04 14:19:30 作者: rapoo

Linux那些事儿 之 ext4文件系统(0) 引子

曾经以为人生就这样了,浮躁的心拒绝再看代码。然而来到美国两年之后,我于本月初去了一趟拉斯维加斯,发现在那儿找个美国小姐要八百美金,而且还不是包夜。当那个金发美女都已经走进我的房间,我却因为价钱太贵承受不起而决定取消的时候,我觉得我的人生真是太失败了。那晚,看她出去之后,我内心一阵郁闷,于是打开电脑开始看A片,怎奈看到一半电脑竟然说文件系统崩溃了。我心想ext4文件系统不是号称很强大吗,怎么这么容易就崩溃了呢?而且平时也不崩溃,怎么关键时候就这么坑爹啊!于是我连夜看了一晚上ext4文件系统的代码,发现是由该文件系统里的一个bug引起的。折腾了半天,给内核打了个补丁,解决了这个问题,系统能用了,然而却再也没心情看A片了,倒是觉得有必要把这些ext4文件系统的代码的阅读心得给记下来。于是便有了这个系列文章。

看内核代码的第一个问题是相关的代码到底在哪里。话说距离写usb那些文字已经过去五年了,而我已经从当初的IT民工变成了今日的北美猥琐男。尽管我已不再年轻,但我依然像杨钰莹一样纯洁,我依然保留着那份男人的直觉,这直觉告诉我,ext4文件系统相关的代码在fs/ext4目录下面,列举一下该目录里面的内容:(我看的代码是Linux Kernel 3.4.4版本的)

$ls

acl.c bitmap.c ext4_extents.h ext4_jbd2.h fsync.c indirect.c Kconfig mballoc.h move_extent.c resize.c truncate.h xattr_security.c

acl.h block_validity.c ext4.h extents.c hash.c inode.c Makefile migrate.c namei.c super.c xattr.c xattr_trusted.c

balloc.c dir.c ext4_jbd2.c file.c ialloc.c ioctl.c mballoc.c mmp.c page-io.c symlink.c xattr.h xattr_user.c

用wc命令看一下,

$wc -l *

439acl.c

77acl.h

766balloc.c

31bitmap.c

268block_validity.c

667dir.c

296ext4_extents.h

2372 ext4.h

154ext4_jbd2.c

399ext4_jbd2.h

4866 extents.c

262file.c

271fsync.c

208hash.c

1158 ialloc.c

1502 indirect.c

4676 inode.c

509ioctl.c

85Kconfig

14Makefile

5047 mballoc.c

222mballoc.h

604migrate.c

353mmp.c

1423move_extent.c

2607 namei.c

433page-io.c

1689 resize.c

4980 super.c

56symlink.c

43truncate.h

1608 xattr.c

155xattr.h

82xattr_security.c

58xattr_trusted.c

61xattr_user.c

38441 total

纯ext4的代码就有三万八千多行。如果一天看一行的话,一百年也才能看个三万六千多行。但是没办法,学计算机的人都只有苦逼的命。像我这样的丝对于生活其实没有太多选择,如果能选择,那我希望自己生活在新闻联播里,那里是爱的家园,人间的天堂,在那里我不用看代码,也能看得起病,能住上每月77元的廉租房,能在大学食堂以每顿两三元的价钱就餐。然而现实是我根本没有选择,所以,不管代码有多少行,都得硬着头皮看下去。可是这么多文件,从哪儿开始看起呢,先扫一眼Makefile,

$cat Makefile

#

# Makefile for the linuxext4-filesystemroutines.

#

obj-$(CONFIG_EXT4_FS) +=ext4.o

ext4-y := balloc.obitmap.o dir.o file.o fsync.o ialloc.o inode.o page-io.o \

ioctl.o namei.o super.osymlink.o hash.o resize.o extents.o \

ext4_jbd2.o migrate.o mballoc.oblock_validity.o move_extent.o \

mmp.o indirect.o

ext4-$(CONFIG_EXT4_FS_XATTR) += xattr.o xattr_user.oxattr_trusted.o

ext4-$(CONFIG_EXT4_FS_POSIX_ACL) += acl.o

ext4-$(CONFIG_EXT4_FS_SECURITY) += xattr_security.o

按过去的经验,很显然,最基本的文件就是ext4.c。可实际上这个目录下面并没有一个叫做ext4.c的文件。于是意识到有时候,经验这东西吧,就像六脉神剑,也是时灵时不灵。不过另一个经验是,当代的文件系统,基本都是可以以模块方式加载,既然是以模块方式加载嘛,那就必然要调用module_init()函数来初始化模块吧。于是就搜索一下module_init(),

$grep module_init *

super.c:module_init(ext4_init_fs)

原来是在super.c这个文件里面。打开这个文件一看,的确,ext4_init_fs()正是整个模块的入口处。也是我们看代码的起点,而这也就是我们这个故事的开始。

3楼ww2000e昨天 16:44
光看开头了
2楼weiyongtao87昨天 16:43
难道是同一人??!!
1楼weiyongtao87昨天 15:36
楼主的开头使我想起了另一篇文章--《Linux那些事儿》,顶一个。

读书人网 >UNIXLINUX

热点推荐