yaffs2 图表详解-程序员宅基地

技术标签: file  tree  structure  pointers  flash  object  

YAFFS(2)
2008-12-16 20:07

Spare所儲存的資料如下所示:

Image:yaffs_10.jpg


圖十

  • Tags:
  • chunkID:指相對於此yaffs_Object的第幾個Chunk。當Chunk ID為0時,則表此Chunk所儲存的是yaffs_ObjectHeader。
  • serialNumber:用以辨別哪個Chunk為最新的Chunk。當更新此Chunk時,其serialNumber會加1並寫入 至其他Block的Chunk中,並將原Chunk的設為Invalid(表此Data Chunk已無效),但若在將該Chunk設為Invalid之前則發生了斷電(Power Lost)的突發事件,當電源回復並再重新掃描Flash Memory時,會檢查某一yaffs_Object到有兩個一樣的Chunk(其ChunkID相同),但其serialNumber不同,則會比較此 二Chunk的serialNumber,以辨別出哪個Chunk為較新的Data,並將較舊Data的Chunk設為Invalid。如下表所示:

Image:yaffs_11.jpg

Image:yaffs_12.jpg

說明:
當系統發現有兩個相同chunkID的chunk,則檢查兩個chunk的serialNumber。此圖可確定serialNumber為2的必定比 serialNumber為1的還新,則將serialNumber為1的chunk設為Invalid。
說明:
若兩chunk的serialNumber如上,則比較方法為將其中一個chunk的serialNumber值取出,並做 (serialNumber+1) mod 4,運算後的值x。若x等於另一個chunk的serialNumber,表示此chunk為較新的,則把另一個chunk設為Invalid。此圖即可 確定serialNumber為0的較serialNumber為3的更新。

 

* byteCount:表示該yaffs_Object佔此Chunk多少個Byte。
  • objectID:此Chunk屬於哪個Object的Objecct ID。
  • ECC:Tags的Error Correction Code。
  • unusedStaff:保留未使用的欄位。
  • ECC Data:Data Chunk的Error Correction Code。
  • Page Status:當值為0時,表示此值為Invalid。
  • Block Status:保留未使用的欄位。

3.2 Tree Node Structure(Tnode Structure)

  系統欲存取裝置上的Data時是以Logical Address(相對於該File所產生出來的偏移位址)的方式到所指定的位址進行存取,若欲到實體儲存裝置上取得Data,則須再經過一個機制的轉換, 將Logical Address轉換為Physical Address(實際儲存裝置的位址),才可從儲存裝置上讀出Data至RAM中。這個機制最簡單的方法就是在RAM上建立一個Logical Address到Physical Address的對映表格(Mapping Table)。直接將Logical Address對映至Physical Address。如圖十一所示: Image:yaffs_13.jpg


圖十一-在RAM中建立Logical Address對應至Physical Address的對映表格

在YAFFS中也使用了Logical Address到Physical Address 的對映機制。所使用的機制稱之為Tree Node Structure或Tnode Structure。

  Flash Memory掛載時,YAFFS會為每個File在RAM中建立一個Tree,當有一個要求要存取某個Chunk(或Logical Address)時,則會經由Tree Node Structure的轉換方式,找到Chunk的Physical Address。

使用Tree Node Structure的優點為位址轉換時間較迅速。Tree Node Structure的轉換Time Complexity為O(log N),若是直接使用Logical Address to Physical Address的Mapping Table,則位址轉換為線性搜尋(Linear Search),此種搜尋方式的Time Complexity為O(N)。YAFFS採用此種方式來做為位址轉換的機制可提升整體的存取速度。

  Tree Node Structure是由多個Tree Node(或Tnode)所組成。依據Level的不同而分成兩個部份:

  • Internal Tnode:每個Internal Tnode由8個Pointers所組成。
  • Lowest-Level Tnode(Level 0 Tnode):每個Lowest-Level Tnode由16個Entries所組成。

Image:yaffs_14.jpg


圖十二

在Tree建立好後,當系統發出要存取該File的某個Chunk時,例如:Chunk 0x235,就要在Tree上做Traverse的動作,以找尋到要求的Chunk。Traverse的步驟如下:

1. 將十六進制轉化為二進制:0x235  0000001000110101

2. 將二進制切割成000.000.100.011.0101,每一個切割區代表一個Level,由於Lowest-Level包含有16個Entries, 因此切割出4個Bit(Bit 3 to 0)。Internal Level的Tnode皆包含8個Pointer,因此其餘皆切割為3個Bit。

3. 根據所切割出來的Bit整理成下表:

Level Bits Selected Value
3 or more if they exist >=10 Zero
2 9 to 7 100 binary = 4
1 6 to 4 011 binary = 3
0 3 to 0 0101 binary = 5

4. 根據表格中各Level的值進行Traverse。

Step1:Level 2100=4 Step2:Level 1011=3

Image:yaffs_15.jpg

Image:yaffs_16.jpg

Step3:Level 00101=5

Image:yaffs_17.jpg

當Tree Node Structure剛開始建立時,僅會建立Lowest-Level Tnode,當File所配置的Chunk數超過16個時,則此Tree會建立一個internal Tnode,並將其第0個Pointer指向原本的Lowest-Level Tnode。當讀取到的Chunk數愈來愈多時,會一直新增Tnode,且Tree亦會愈來愈高,其Max-Level最大為6。

Step1 Step2

Image:yaffs_18.jpg


Image:yaffs_19.jpg

Step3 Step4

Image:yaffs_20.jpg

Image:yaffs_21.jpg

  在File已在RAM建立好Tree Node Structure後,若此File的Size變大時,則會再多配置Chunk給此File,在將Data寫入至Page後,則會去更新File的 Tree Node Structure,將新配置到的Chunk加入至Tree Node Structure中,更改步驟如下:

1. 搜尋新配置到的Chunk ID。

2. 若在Internal-Level搜尋的過程中,發現沒有Tnode,則建立一個Internal-Level的Tnode。

3. 當搜尋到Lowest-Level時,若也無Tnode存在,則建立一個Lowest-Level的Tnode。

4. 根據Chunk ID中Level 0所代表的值x,到Lowest-Level Tnode中的第x個Entry中檢查有無該Chunk的實體位址存在,若沒有則將實體位址填入該Entry,若已存在則將比較兩Chunk在Spare 中的serialNumber,將較新的Chunk的實體位址寫入該Entry中,並將舊的Chunk設為Invalid。

1. 搜尋新配置到的Chunk ID 2. 在Internal-Level搜尋過程中,發現無Tnode存在,建立一Tnode

Image:yaffs_22.jpg

Image:yaffs_23.jpg

3. 在搜尋過程中,發現無Lowest-Level Tnode存在,則建立一Lowest-Level Tnode,並將該Chunk ID寫入對應的Entry中

Image:yaffs_24.jpg

3.3 YAFFS Garbage Collection

Garbage Collection主要是用於將已不必要存在且浪費空間的Block做回收的動作,以增加可用的Block數。而Garbage Collection只有某些事件發生時才會執行。

在YAFFS中只有在下列事件發生時會執行Garbage Collection:

  • 將Data寫入Flash Memory
  • 更新yaffs_ObjectHeader

而YAFFS的Garbage Collection又分成兩種Mode:Aggressive Mode及Passive Mode,其相異點如下表所示:

Aggressive Mode Passive Mode
執行條件 ErasedBlocks <= (PreservedBlocks + 1)
ErasedBlocks:空Block數
PreservedBlocks:保留Block數
ErasedBlocks > (PreservedBlocks + 1)
檢查回合數 Iterations = (EndBlock-StartBlock) + 1 1. Iterations=(EndBlock-StartBlock) + 1
2. Iterations = Iterations / 16
3. Iterations = 200 if Iterations >200

 

  YAFFS的Garbage Collection執行步驟如下:

1. 從currentDirtyChecker到End Block之間尋找Dirtiest Block(包含最多Invalid Chunk的Block)

Image:yaffs_25.jpg

圖十三

2. 將currentDirtyChecker重置至所發現的Dirtiest Block的位置

Image:yaffs_26.jpg

圖十四

3. 將Dirtiest Block中的Valid Page複製至其他的Empty Chunk中。

Image:yaffs_27.jpg

圖十五

4. 再將Dirtiest Block清除成Empty Block。

Image:yaffs_28.jpg

圖十六

3.4 Wear-Leveling

  當Flash Memory在使用時,常常會對Flash Memory內的某個檔案做修改的動作,若此時檔案的大小更動而需要更多Page時,且在Flash Memory內仍有空的Block,則會配置空的Block給該檔案,若Flash Memory內已無空的Block,則會執行Garbage Collection的動作,清出空的Block以供使用。而在挑選空Block或使用Garbage Collection時挑選Dirtiest Block時,可能會造成部份的Block常常被挑選,而其他Block則很少被挑選配置。

Image:yaffs_29.jpg

圖十七

由於Flash Memory的特性,那些常常被挑選的Block可能會因為過度的使用而造成損毀,為了避免這種負擔不均的情形發生,因此在大部份的Flash- Specific File System上都會設計一種方法以避免此種情形發生,此方法即稱為Wear-Leveling。

使用Wear-Leveling時,在挑選Block時不會常常固定在某幾個Block上,而可使大部份Block的存取次數能夠平均,不會造成部份Block過度存度而造成毀損。 Image:yaffs_30.jpg

圖十八

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

智能推荐

便携式iv检测仪解析

在应用场景方面,便携式IV功率测试仪广泛应用于光伏电站的日常运维、光伏组件生产过程中的质量控制以及光伏项目的前期评估等环节。在光伏电站运维中,定期对光伏组件进行IV测试,可以及时发现性能下降或损坏的组件,为电站的运维提供有力支持。首先,从工作原理来看,光伏电站便携式IV功率测试仪通过模拟太阳光照射光伏组件,并测量组件在不同电压下的电流输出,从而绘制出IV曲线。此外,测试仪还可以计算光伏组件的功率输出、转换效率等参数,为用户提供全面的性能评估。

postgresql 索引之 hash_load_categories_hash postgres-程序员宅基地

文章浏览阅读3.6k次。os: ubuntu 16.04postgresql: 9.6.8ip 规划192.168.56.102 node2 postgresqlhelp create indexpostgres=# \h create indexCommand: CREATE INDEXDescription: define a new indexSyntax:CREATE [ UNIQUE ..._load_categories_hash postgres

face++实现人脸识别及人脸相似度对比_face++人脸识别 html5-程序员宅基地

文章浏览阅读4.8k次。使用face++,先获取key和secret下方是人脸识别,还添加了画出人脸轮廓的正方形下方是人脸识别,还添加了画出人脸轮廓的正方形 import requests#网络访问控件 from json import JSONDecoder#互联网数据交换标准格式 import cv2 as cv#图像处理控件 http_url =&amp;amp;amp;quot;https://a..._face++人脸识别 html5

desencrypt java md5_Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类-程序员宅基地

文章浏览阅读322次。很多时候要对秘要进行持久化加密,此时的加密采用md5。采用对称加密的时候就采用DES方法了import java.io.IOException;import java.security.MessageDigest;import java.security.SecureRandom;import javax.crypto.Cipher;import javax.crypto.SecretKey;im..._java desencrypt.encrypt(pass)

BZOJ 2818 欧拉函数,线性筛_线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj-程序员宅基地

文章浏览阅读145次。题目链接:https://www.acwing.com/problem/content/description/222/给定整数N,求1<=x,y<=N且GCD(x,y)为素数的数对(x,y)有多少对。GCD(x,y)即求x,y的最大公约数。输入格式输入一个整数N输出格式输出一个整数,表示满足条件的数对数量。数据范围1≤N≤10^7输入样例:4..._线性筛预处理质数表, 并求出欧拉函数, 预处理前缀和即可 bzoj2818boj

使用 arm-linux-androideabi-addr2line 工具定位 libunity.so 崩溃问题-程序员宅基地

文章浏览阅读710次,点赞13次,收藏7次。它的名称有点不同 - aarch64-linux-android-addr2line。尽管该实用程序的名称不包含单词arm,但它成功地解密了arm64-v8下的堆栈跟踪,并通常感知arm64-v8的字符。是 NDK 自带的调试工具,可以用来分析 so 崩溃时输出的的内存地址。之后就是通过 cmd 进入到这个路径。找到了 64 位所需的实用程序。_arm-linux-androideabi

随便推点

android:AppWidget 窗口小部件的开发思想和Demo_安卓小部件开发demo-程序员宅基地

文章浏览阅读1.1k次。AppWidget 窗口小部件的开发思想和Demo  这篇文章讲一下android系统“窗口小部件”(也叫做,主屏幕部件)的开发过程。什么叫窗口小部件呢?是指在主屏幕上显示的独立视图(不过填充了数据)。这些视图的数据内容由后台进程顶起更新。要用到RemoteViews来显示部件,还要指派广播接收器更新这些RemoteViews. 既可以单独做个窗口小部件,也可在App中嵌入多个窗口小部_安卓小部件开发demo

接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题_金蝶中间件部署项目-程序员宅基地

文章浏览阅读844次。接之前的SpringBoot项目通过金蝶中间件部署中未处理的问题新建的springboot项目是2.3.1的版本,打包到金蝶中部署就一直栈内存溢出后来把pom文件中的父依赖换成了2.2.4版本,打包部署到金蝶中就能运行了,我也不知道具体原因。如果有知道具体原因的请不吝赐教。..._金蝶中间件部署项目

基于鹰栖息算法优化的广义回归神经网络(GRNN)预测-程序员宅基地

文章浏览阅读934次,点赞18次,收藏17次。广义回归神经网络 CGRNN, Generalized Regression Neural Network)是美国学者 Don-aid F. Specht 在 1991 年提出的,它是径向基神经网络的一种。GRNN 具有很强的非线性映射能力和柔性网络结构以及高度的容错性和鲁棒性,适用于解决非线性问题。GRNN在逼近 能力和学习速度上较 RBF 网络有更强的优势,网络最后收敛于样本量积聚较多的优化回归 面,并且在样本数据较少时,预测效果也好。此外,网络还可以处理不稳定的数据。

laravel 使用微信的图片内容检测及文字内容检测

微信的图片检测,需要文件大小在1M以内,这就导致用户上传大图的时候无法检测成功,

Zookeeper集群部署和单机部署

【代码】Zookeeper集群部署和单机部署。