上回我们说到,蛋蛋从标签表中看到了一个标签inode的内容,inode里面包含的东西除了那些,还有个更重要的就是货物的位置:到底放哪些盒子里面?
要知道Linux市的货物是用字节组成的长串,有的只占了一个盒子,有的占了多个盒子,甚至成千上万个盒子,而标签表只留了60个字节保存查找信息,根本放不下那么多盒子的位置信息,那么到底该怎么办?我们来看看聪明的饿想她超市怎么解决这个查找的难题。
三级映射
俗话说,有钱能使鬼推磨,为了降低成本,给顾客提供更大的便利,饿想她超市的老板命令工程师赶快解决上面这个问题,搞定了工资翻番,否则卷铺盖走人。工程师老蛋刚刚开始Linux的码农生涯,就接了这么个活,站在自己家的大树底下冥思苦想,想了几天几夜,还是没有头绪。一气之下,他一头撞在树皮上,心想自己要跟月亮上的吴刚一样,一辈子要跟这棵树为伴了。唉,树啊!哎,树!哈哈哈哈!大树底下传来了老蛋的四声大笑:我终于明白了,在这个60个字节里面可以用三级映射来存放货物的地址,就跟树的枝干一样,一级级细分。
如下图,开始是头几个数据盒子的位置,对那种小货物足够了。后面是一级映射表的盒子位置,找到这个盒子就能找到所有的1024个数据盒子,因为里面放了1024个盒子的位置。如果还不够,那么就用后面的二级映射,里面是所有一级映射的位置,从一级映射的盒子里面再找到所有的数据盒子位置,这样就是1024*1024个盒子了。尼玛,还不够,嘿嘿,后面还有三级映射,总共包含1024*1024*1024个数据盒子的位置。
扩展树:真正的树
老蛋得到了饿想她超市创始老板的嘉奖,成了公司技术骨干。但是,后来超市创始老板退休,少老板接班,新官上任三把火,决定建设一个更厉害的第四家分店ext4。他年轻有为,找到老蛋说:蛋仔,你这个三级映射太麻烦了,位置都是固定死的,修改什么的太麻烦,而且如果盒子都是连续放置的,还得在映射里面一条条保存他们的位置,一点都不高效,太浪费空间了。回去给我弄个更好的办法,完不成提头来见!
老蛋觉得自己受到了侮辱,成名作被一个小年轻贬的一文不值,忍着内心的悲愤回到家,跟老婆说自己都想跳槽了。老婆听了,瞪了他一眼:没本事整更牛的,躲开算什么男人。老蛋一想,脑子也转过来了,于是又来到熟悉的大树下,想啊想,还是没办法。突然,他想,瞅瞅大树肯定有办法,一抬头,心中顿时豁然开朗:树啊树,又是你帮了我,不禁老泪纵横~
老蛋这次设计了一棵真正的大树来放货物的地址。如下图,树有一个根节点,后面有很多子节点,每个节点都有一个header,header后面的数据有两种类型,第一种是索引,就是树枝的位置,第二种是叶子,放数据盒子的位置。这样一级级就可以查到,而且数据节点表示的是一串连续盒子的开头位置和数量,而不用全都一个个列出来。老蛋再次得到了少庄主的嘉奖,他得意地回家对老婆说:每一个成功的男人背后都有一个不认输的女人!
节点头
树枝内容,指向更细的树枝
叶子内容
引用
https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout http://www.datarecoverytools.co.uk/2009/11/16/learn-more-about-ext4/ http://blog.chinaunix.net/uid-26430381-id-4559492.html
想要每天看一条SSD文章吗?扫一扫,微信关注我们!或者微信搜索公众号ssdfans关注。