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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fudan_abc/article/details/7906608

曾经以为人生就这样了,浮躁的心拒绝再看代码。然而来到美国两年之后,我于本月初去了一趟拉斯维加斯,发现在那儿找个美国小姐要八百美金,而且还不是包夜。当那个金发美女都已经走进我的房间,我却因为价钱太贵承受不起而决定取消的时候,我觉得我的人生真是太失败了。那晚,看她出去之后,我内心一阵郁闷,于是打开电脑开始看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()正是整个模块的入口处。也是我们看代码的起点,而这也就是我们这个故事的开始。

展开阅读全文

没有更多推荐了,返回首页