• 沒有找到結果。

铡,遣菰怒说较文件系统中必须包括,boo蛐a嚣口.4.18:

在文檔中 硕士学位论文 (頁 34-42)

7.在存储设备上安装LILO。接着上丽的例子,采用CF卡启动,那么先将 该设备挂载弱主梳lmnt/cf,然器魏行图3-6中命令:

图3-6安装LILO命令

执行这条命令的前提怒就是标机上匏MTD设蠡挂载要《嚣发主机上,假设路 径为/mnt/cf,然后调用系统调用chroot0将该挂载霸录设为根目录,然后执行上 述命令,就是将该鼹录下的etc/target.1ilo.conf文件作为Boofloader的配置文传:

8.对根文件系统解挂

3.7本章小结

本章童要奔缁了对Linux肉核的配置和重薪编译,然箭建立文件系统,并为 其创建引母文件,使得该系统成为一个完掇的可运行的操作系统。究成了上述工

{筝之后,霹以说一个最筒革盼嵌入试操作系统已经完成,傻仅仅如此是不够,因 为内核中保留下来的模块以及文件系统的镑种功能还是针对通用操作系统的,但 瘸予嵌入搽作系统i翊羊存在不是之处。毽这些部分又必须瀚保留下来,所毅后面

的正作就是对现在的新系统中的某魑部分进行进一步的优化。

硕士学位论文 第四章Ext2文件系统的机制优化

第四章Ext2文件系统的机制优化

4.1思路与工作

在前面的工作中,已完成了对Linux操作系统的初步裁减及重新构建,但仅 仅完成这一不是不够的,不仅要“造”,还需要“改”——这也就是优化的必要性:

虽然在“造”的步骤中已经删去一些不必要的模块、组件,但是其内核的众多算法 还是服务于通用操作系统,当移植到嵌入式系统之后,其优点未必能够得以体现;

相反,甚至有时会降低嵌入式系统的运行效率。一个完善的嵌入试操作系统不仅 要求体积小、耗资源少,还要求效率高,能很好的适应系统环境。所以针对某些 算法及结构进行优化改造势在必行。本章首先先分析Ext2文件系统的结构和功 能,然后再已构造好新内核的基础上,针对Ext2文件系统的数据块预分配机制 进行分析及改造。

4.2 Ext2文件系统

Ext2是Linux中使用最普遍的文件系统。和其他文件系统一样,被分成若干 个大小相等数据块,文件则存放在数据块中。为了更有效的管理,EXT2文件系 统还分为多个块组饵lock Group)口”,每个块组中包含有相同数量的数据块。每个 块组再被划分为超级块、组描述符、数据块位图、索引节点位图、索引节点表、

数据区这几部分,其中的数据区就是用于存放文件数据的部分。EXT2文件系统 分区和块组结构如图4一l所示。

,/

引导块 块组0 块组n

/\\

数据块 索引节点 索引节

r超级块 组描述符 数据块

位图 位图 点表

图4-1 Ext2文件系统块组分布图

任何Ext2分区中的第一个数据块是不受Ext2文件系统的管理,因为这一块 是为分区的启动扇区包保留的。其他部分则划分为数据块组。如图所示,在Ext2

硕士学位论文 第四章Ext2文件系统的机制优化

文件系统中的所脊块组大小相同并被顺序存放,因此,内核可以从炔组的整数索 弓|{曩容易的褥到磁盘中懿一个块缀的位置。

由于内核尽可能地把属于一个文件的数据块存放在同一块组中,所以块组减 少了文件的碎片。

而对于数据块,在同一个Ext2文件系统,所有的数据块的大小都是一样的。

但与其他文l牛系统不同鲍是,不嘲的Ext2文件系统的数攥块大,J、可以不棚同,

每个Ext2文件系统的数据块大小可以在逮立文件系统时指定。图4.2描述的算 法是如何在创建文件系统时确定该文件系统数据块的大小。

圈4-2Ext2文辟系统韧始侣数据块雾涤

上述算法中BLOCK SIZE为一常量,值为1KB,变量blocksize设置为常量

BLOCK SIZE,毽靛是说EX32文徉系统鹣记录块默谈丈夸秀1KB。热采程存褚

资源充足的情况下,为了提高文件系统的读/写效率,也可以采用2KB或4KB,

方法裂是遴过设鬟内孩孛豹一个淤设冬号必下标豹搓锌数缀hardsed s豇臻秘,在 系统初始化时设鼹该数组中的相应元素,如果该设备止的记蒙块大小大于

BLOCK S琵E,那么裁数致梵准。

4.2.1 Ext2索引节点

Ext2文件系统中,索引节点【32l是基本的数据块,每个文件和目录有且只有一 个索弓l节杰与之对应。每个块组中的索引节点傈存在索雩i节点表串,两时落保存 有跟踪节点分配的位图。Ext2索引节点的备个数据域在表4.1中描述。

硕士学位论文 第四章Ext2文件系统的机制优化

硕士学位论文 第四章Ext2文件系统的机制优化

硕士学位论文 第四章Ext2文件系统的机制优化

4.2.4Ext2的目录结构

在Ext2文件系统中,目录实际是特殊文件。目录文件中包含了目录项的列 表,而每个目录项包含的信息如表4.4所示。

表4-4目录项信息

索引节点 目录项的索引节点

名称长度 目录项的名称长度,单位为字节

名称 目录项名称

每个目录的前两个目录始终是标准的“.”和“~”,分别代表“本目录”和“父目 录”。当用户需要打开某个文件时,首先要指定文件的路径和名称。根据路径和 名称,文件系统可搜索到文件的对应索引节点,从而可读取文件中的数据。

4.3 Linux文件系统的数据块分配机制

上面分析了Ext2文件系统的结构,下面就针对该文件系统的功能机制进行 研究和分析。

4.3.1 Ext2文件系统的分配机制及其优点

传统的桌面Linux是采用EXT2文件系统的数据块预分配机制(Per-allocating mechanism)[34】为文件分配数据块。数据块预分配机制是在从文件系统分区分配数 据块时,文件系统不仅为该文件分配所需的数据块,而且还将为其预分配多达8 个连续的数据块。当文件被扩展、并要申请新数据块时,文件系统首先察看该文 件是否有足够的预分配数据块,如果以为其预分配数据块,则利用已分配的数据 块进行文件扩展:否则,就再为其重新分配数据块。采用这种数据块预分配机制 的优点就是:可以减少由于文件扩展而带来的磁盘碎片,从而提高了文件系统的 访问效率。

4.3.2Ext2的数据块预分配机制与嵌入式系统的不适应性

对于通用的桌面操作系统,需要经常的对现有文件进行扩展,从而上述的数 据块预分配机制非常有效,而且也是非常有必要的口51。但是,当面对嵌入式系 统这个课题时,对于文件系统提出的要求却不尽相同。首先,嵌入式系统虽然各 具特色,但他们都有一个共同之处——硬件条件不足,系统资源较少。一般情况

硕士学位论文 第四章Ext2文件系统的机制优化

下,一个嵌入式系统的系统文件的大小是十几kb到几十kb不等,而每次预分配 平均要分酝4-8个数据块,以每个数据块的大小必lkb谤舞,也就是说每令文件 要多占用4.8kb的空间,这一笔消耗相对来说是比较奢侈的;其次,完成数据块 预分配机制就是辩每个文l牛她写入都要对磁盘的物理块母以及逻辑块号进行多 次扫描,这样也会增加文件的写入时间。所以在这里提出一个设想,可不可以改 造或者取缔这种数据块预分配机制?

4.3.3 Ext2文件系统优化

为了解决数据块预分配带来的问题,可以试着当文件系统为文件分配数据块 懿瓣经,不撬行颡分配豹泛箨。那么,善建蔌文撵系统静凑孩添璐羲手。下瑟瑟 4。3中算法列出了Ext2 new block0[35,3曰函数中的一部分分配方法,这段代码就 是该丞数审矮子宠残数据绞预分黧瓣部分。

图4-3 Ext2数据块预分配葵涤

Ext2 new block(inode,goal,&prealloc count,&prealloc block,&err)是Ext2文 纷系统进纷貔理块分配弱孩心丞数,宅包食在fs愿xt2/balloc。e文传孛。逶避该丞 数为inode(索引节点)分il己一个物理块。参数goal表示搜索到可用于分配的参 考块号。褥・prealloc count,prealloe 是颈分配撬裁孛嚣令鬟要熬参数,.block

prcalloc 存放的是预分配给某一文件但还没使用的数据块数,_count prealloeblock 存放鲍是下一次要使用豹谈分配块瓣逻辑块号【37】。如果prealloe count撂镑裴空 且等于零假,则对该块的连续后继来被使用的数据块作预分配处理;后者则是记

硕士学位论文 第四章Ext2文件系统的机制优化

录用于预分配的数据块号。

从代码分析可以知道,在数据块分配完成后,就用一个变量tmp记录下这次 所分配的最后一个数据块的块号,也就是文件实际所占用文件系统中的物理块 号,然后块号加1,也就是将块指针指向其后继数据块。如果此块为自由块,那 么就将此块作为第一个预分配块,接着,通过一个循环来扫描连续相邻的数据块,

如果也满足于分配条件,那么将其作为预分配数据块。数据块预分配流程如图 4-4所示。

7次

IⅡ11p纪录r1下移『——一“”“广_1“““”L…“”’H

卜——+ 共预分配8个数据块・———1

图4-4数据块预分配示意图

从图4.4中可明显的看出预分配机制每次预分配多个数据块,在默认情况下,

EXT2文件系统的数据块大小是IKB。完成数据块预分配的工作之后,不管实际 文件原本的大小为多少,平均都要多占用4-8KB的磁盘空间,以便于文件进行 二次扩展时,减少磁盘碎片。

那么,如何来删除这一机制呢?一种选择就是将内核源码中关于数据块预分 配操作的代码一一删减,从而彻底取消数据块预分配。但是,对于Linux内核源 码中,各模块之间的联系频繁、复杂,所以这种方案的工作量相当庞大,可行性 不高;于是,退而求其次,考虑到数据块预分配的工作流程,可以考虑将预分配 过程中的某个必要环节打断,或者不满足完成该功能的某个必要条件,从而中止 数据块预分配的执行,达到屏蔽该机制的目的,这种选择的可行性就大大提高了。

回顾算法4.2,可以在数据块分配完成后,用trap记录下当前块号,但不执行 tmp+l,也就是说保持当前块号不动,从而不执行数据块预分配的准备工作;同 时可以通过改变prealloccount,prealloq block这两个参数的值,使其不满足执

回顾算法4.2,可以在数据块分配完成后,用trap记录下当前块号,但不执行 tmp+l,也就是说保持当前块号不动,从而不执行数据块预分配的准备工作;同 时可以通过改变prealloccount,prealloq block这两个参数的值,使其不满足执

在文檔中 硕士学位论文 (頁 34-42)

相關文件