精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

littlefs原理分析—磨損均衡(六)

系統 OpenHarmony
本文介紹了littlefs中與磨損均衡相關的策略以及塊分配算法。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

前言

前面已經對littlefs的原理分析了5篇文章,內容包括了:

  • littlefs整體的存儲結構
  • commit機制
  • fetch操作
  • 目錄操作
  • 文件讀寫操作

本文是littlefs原理分析系列最后一篇文章,主要介紹littlefs中與磨損均衡相關的策略,同時也會對其中的塊分配算法進行介紹。

littlefs有以下防止磨損相關的措施:

  1. 寫時壞塊的檢測和寫入恢復。
  2. 均勻地進行塊的分配:由塊分配算法實現。
  3. 定期重分配元數據所在塊。

1、寫時壞塊的檢測和寫入恢復

littlefs中當進行文件、目錄元數據等的寫入時,最后會調用函數lfs_bd_flush將數據最終寫入到磁盤。lfs_bd_flush函數寫入完后,會將內存中寫入的數據和磁盤上的數據進行比較。如果數據不一致,則可能是壞塊。

方法如下:

  • 寫入時通過回讀磁盤上的數據進行驗證,來檢測壞塊。
  • 檢測到壞塊后,清除壞塊,重新分配塊,然后重新寫入。

lfs_bd_flush函數檢查數據是否一致部分的分析如下:

// 當將緩存中的數據回寫到磁盤時,檢測壞塊
lfs_bd_flush(lfs_t *lfs,
| lfs_cache_t *pcache, lfs_cache_t *rcache, bool validate)
| ...
|
| // 調用lfs_bd_cmp比較磁盤上的數據是否與寫入的數據相同
| // 如果不同則可能遇到了壞塊
|-> if (validate) {
| lfs_bd_cmp(lfs,
| NULL, rcache, diff,
| pcache->block, pcache->off, pcache->buffer, diff);
| }
|
|-> ...

如在文件寫入數據時,在函數lfs_file_flush中,檢測到壞塊時會重新分配塊再進行寫入操作:

lfs_file_flush(lfs_t *lfs, lfs_file_t *file)
|-> ...
|
|-> while (true) {
| // 調用lfs_bd_flush寫入數據,并比較數據是否寫入正確
| int err = lfs_bd_flush(lfs, &file->cache, &lfs->rcache, true);
| if (err) {
| // 檢測到壞塊則跳轉到relocate
| if (err == LFS_ERR_CORRUPT) {
| goto relocate;
| }
| return err;
| }
| break;
|
| relocate:
| // 重新分配塊并再次進行寫入操作
| LFS_DEBUG("Bad block at 0x%"PRIx32, file->block);
| err = lfs_file_relocate(lfs, file);
| if (err) {
| return err;
| }
| }

2、塊分配

(1)lookahead buffer

littlefs中使用一個lookahead buffer來管理和分配塊。lookahead buffer是一個固定大小的bitmap,記錄一片區域內塊分配的信息。

lookahead buffer圖例如下,其中假設總共有64個塊,lookahead buffer的大小為8,lookahead buffer對應塊中現分配了文件A、D和目錄B、C的塊:

#littlefs原理分析#[六]磨損均衡-開源基礎軟件社區

lookahead buffer相關數據結構如下:

struct lfs_free {
lfs_block_t off; // lookahead所有block整體的偏移
lfs_block_t size; // lookahead中塊的總數
lfs_block_t i; // 在lookahead_size中的索引,表示當前位于第幾個block
lfs_block_t ack; // 所有剩余空閑block個數
uint32_t *buffer; // lookahead的bitmap塊管理緩存區
} free;

(2)查找已分配的塊

lookahead buffer只記錄了一片區域內塊分配的信息,當需要知道其他區域塊分配的情況時,就需要進行掃描文件系統來查找已分配的塊。如lookahead buffer中已經沒有空閑塊、需要推移lookahead buffer來查找文件系統中的其他空閑塊。

掃描和查找已分配的塊的過程如下:

  1. 將lookahead buffer位置推移一個lookahead_size,并將lookahead buffer清0。
  2. 從超級塊開始遍歷文件系統中所有目錄和文件,以遍歷所有已分配的塊。如果塊位于lookahead buffer所管理區域,則將lookahead buffer中相應位置為1。

lookahead buffer只用固定大小的bitmap存儲已分配塊的信息,是littlefs中的一種權衡,這樣雖然更耗費時間,但有效節省了RAM空間資源。

代碼分析如下:

lfs_alloc(lfs_t *lfs, lfs_block_t *block)
| ...
|
| // 當lookahead buffer中沒有空閑塊時,需進行掃描
|
| // 1. 推移lookahead buffer
|-> lfs->free.off = (lfs->free.off + lfs->free.size)
| % lfs->cfg->block_count;
| lfs->free.size = lfs_min(8*lfs->cfg->lookahead_size, lfs->free.ack);
| lfs->free.i = 0;
|
| // 2. 將lookahead buffer清0
|-> memset(lfs->free.buffer, 0, lfs->cfg->lookahead_size);
|
| // 3. 遍歷文件系統進行掃描和查找
|-> lfs_fs_rawtraverse(lfs, lfs_alloc_lookahead, lfs, true);
|
|-> ...

其中,lfs_fs_rawtraverse函數會從超級塊開始遍歷整個文件系統,對整個文件系統中所有已經分配的塊調用回調函數lfs_alloc_lookahead。lfs_alloc_lookahead函數分析如下:

// lfs_fs_rawtraverse函數傳入到lfs_alloc_lookahead函數的參數
// 分別為lfs結構體指針p,和塊號block
lfs_alloc_lookahead(void *p, lfs_block_t block)
|-> lfs_t *lfs = (lfs_t*)p;
|
| // 獲取塊號相對lookahead buffer的偏移
|-> lfs_block_t off = ((block - lfs->free.off)
| + lfs->cfg->block_count) % lfs->cfg->block_count;
|
| // 若該塊處于lookahead buffer所管理的范圍內,
| // 則設置bitmap對應位,表示該塊已分配
|-> if (off < lfs->free.size) {
| lfs->free.buffer[off / 32] |= 1U << (off % 32);
| }
| return 0;

(3)塊分配算法

塊分配算法的過程總結:首先嘗試從lookahead buffer中找到下一個空閑塊,若沒有則將lookahead buffer位置推移一個lookahead_size,執行上一小節中的掃描和查找文件系統過程,再嘗試從lookahead buffer中找到下一個空閑塊,以此循環進行。

以下為幾次分配和掃描的示例:

boot...         lookahead:
fs blocks: fffff9fffffffffeffffffffffff0000
scanning... lookahead: fffff9ff
fs blocks: fffff9fffffffffeffffffffffff0000
alloc = 21 lookahead: fffffdff
fs blocks: fffffdfffffffffeffffffffffff0000
alloc = 22 lookahead: ffffffff
fs blocks: fffffffffffffffeffffffffffff0000
scanning... lookahead: fffffffe
fs blocks: fffffffffffffffeffffffffffff0000
alloc = 63 lookahead: ffffffff
fs blocks: ffffffffffffffffffffffffffff0000
scanning... lookahead: ffffffff
fs blocks: ffffffffffffffffffffffffffff0000
scanning... lookahead: ffffffff
fs blocks: ffffffffffffffffffffffffffff0000
scanning... lookahead: ffff0000
fs blocks: ffffffffffffffffffffffffffff0000
alloc = 112 lookahead: ffff8000
fs blocks: ffffffffffffffffffffffffffff8000

(4)均勻分配方法

介紹了塊分配算法后,現在回過來介紹塊分配算法中與磨損均衡相關的策略。

littlefs中使用了一個簡單的策略來實現均勻地分配:

  • 使用lookahead buffer線性地分配塊,這樣在一次運行中塊分配是循環磁盤均勻進行的。
  • 每次掛載文件系統時,將lookahead buffer推移一個隨機的偏移量,這樣在多次運行過程中,只要這個隨機偏移量是均勻的,那么整體的分配也是均勻的。

相關函數分析:

lfs_mount(lfs_t *lfs, const struct lfs_config *cfg)
|-> lfs_rawmount(lfs_t *lfs, const struct lfs_config *cfg)
|-> ...
|
| // 1. 計算隨機數
|-> lfs_dir_fetchmatch(...)
|-> ...
|
| // 使用crc計算隨機數
|-> lfs->seed = lfs_crc(lfs->seed, &crc, sizeof(crc));
|
|-> ...
|
| // 2. 隨機對lookahead buffer進行偏移
|-> lfs->free.off = lfs->seed % lfs->cfg->block_count;

3、定期重分配元數據所在塊

littlefs中會定期進行元數據對應塊的重分配,以防止元數據塊的磨損。

每次元數據commit過程中因空間不足,而進行compact或split操作時,revision count也會隨著更新。當revision count為block_cycles的整數倍時,會進行元數據對應塊的重分配。其中,block_cycles為用戶配置的值。

相關函數分析:

lfs_dir_compact(lfs_t *lfs,
| lfs_mdir_t *dir, const struct lfs_mattr *attrs, int attrcount,
| lfs_mdir_t *source, uint16_t begin, uint16_t end)
|-> ...
|
| // revision count為block_cycles的整數倍時,進行元數據對應塊的重分配
|-> if (lfs->cfg->block_cycles > 0 &&
| (dir->rev % ((lfs->cfg->block_cycles+1)|1) == 0)) {
| ...
|
| // we're writing too much, time to relocate
| tired = true;
| goto relocate;
| }
|
|-> ...
|
| relocate:
|-> ...

總結

本文介紹了littlefs中與磨損均衡相關的策略以及塊分配算法,到這里littlefs文件系統原理分析系列文章已經結束。小編也是希望通過對littlefs文件系統的仔細分析,讓相關讀者更深入了解OpenHarmony LiteOS-A內核的文件系統的原理,而且littlefs文件系統也不僅僅是在OpenHarmony系統上使用,它也是一個廣泛使用的小型文件系統,相信掌握它的原理對嵌入式開發者有著“鼎力相助”的作用。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-11-07 15:27:07

LittlefsFetch操作

2022-11-15 09:24:16

littlefs文件讀寫

2022-10-27 16:07:24

littlefs存儲結構

2022-11-09 08:52:57

littlefs目錄操作

2022-11-02 15:56:45

littlefscommit機制

2024-03-28 13:10:20

負載均衡LVSHaproxy

2025-09-01 08:57:31

2023-11-28 15:32:30

負載均衡算法

2010-04-26 14:52:37

2011-05-26 16:18:51

Mongodb

2009-11-09 12:45:44

路由負載均衡

2015-09-25 09:56:37

負載均衡

2010-04-20 12:16:05

NAT負載均衡

2010-04-20 20:46:01

負載均衡

2010-05-07 13:09:06

2010-05-06 13:16:33

2011-12-02 22:51:46

Nginx負載均衡

2024-06-18 08:14:21

2010-05-06 12:18:34

IP負載均衡
點贊
收藏

51CTO技術棧公眾號

欧美久久在线观看| 奇门遁甲1982国语版免费观看高清 | av在线com| 婷婷开心激情网| 久久中文欧美| 久久激情视频久久| 精品一区二区三区四区五区六区| 亚洲国产成人二区| 亚洲天堂成人网| 韩国一区二区三区美女美女秀| 日韩熟女一区二区| 亚洲美女视频| 亚洲欧美日韩国产精品| 欧洲美女亚洲激情| 电影网一区二区| 亚洲激情图片一区| 区一区二区三区中文字幕| 精品国产区在线| 国产av一区二区三区传媒| 偷拍视频一区二区三区| 亚洲一区二区在线免费看| 三区精品视频观看| 婷婷五月综合激情| 国产精品一卡二卡在线观看| 欧美中文字幕在线观看| 草视频在线观看| 成人综合一区| 亚洲精品自在久久| av电影中文字幕| 欧美日韩视频免费看| 黄色一区二区在线观看| 超级碰在线观看| 天堂аⅴ在线地址8| 成人免费观看视频| 92看片淫黄大片看国产片| 久久国产乱子伦精品| 99精品视频免费观看视频| 欧美噜噜久久久xxx| 在线观看天堂av| 久久97视频| 日韩精品日韩在线观看| 2018国产精品| 最新国产精品精品视频| 欧美一区二区三区在线观看视频| 爆乳熟妇一区二区三区霸乳| 欧美aa在线观看| 亚洲高清免费视频| 欧日韩免费视频| heyzo高清中文字幕在线| 亚洲综合丝袜美腿| 国产成人亚洲综合无码| 成人直播在线| 国产一区中文字幕| 欧美另类高清zo欧美| 久久精品网站免费观看| 99免费在线观看视频| 99草在线视频| 国产呦萝稀缺另类资源| 亚洲影院高清在线| 午夜精品久久久久久久第一页按摩| 久久99国产乱子伦精品免费| 国产美女久久精品香蕉69| 亚洲天堂网在线视频| 久久精品国产999大香线蕉| 国产精品一区二区久久久| 最新国产中文字幕| 蜜臀a∨国产成人精品| 国产美女被下药99| 99久久久国产精品无码免费 | 男人天堂999| 国产a级片免费观看| 电影在线高清| 欧美国产国产综合| 国产又爽又黄ai换脸| 亚洲欧美成人影院| 午夜精品久久久久久| 无码精品a∨在线观看中文| 成人教育av| 欧美三级韩国三级日本一级| 樱花草www在线| 在线精品自拍| 亚洲精品在线观看www| 摸摸摸bbb毛毛毛片| 99精品电影| 久久久最新网址| 69视频免费看| 国产一区二区在线影院| 国产一区二区高清不卡| 国产黄色片在线播放| 亚洲欧美日韩在线| 成年人网站免费视频| 国产综合av| 欧美变态凌虐bdsm| www.久久国产| 亚洲第一偷拍| 欧美性视频精品| 中文字幕在线日亚洲9| 国产成人免费视| 日韩av高清| 日本高清在线观看视频| 欧美性生交大片免网| 九九九九九九九九| 亚洲精华一区二区三区| 久久国产精彩视频| 麻豆精品久久久久久久99蜜桃| 韩国一区二区视频| 蜜桃传媒一区二区| 在线播放蜜桃麻豆| 欧美在线短视频| 性欧美丰满熟妇xxxx性久久久| 久久激情电影| 欧美在线性视频| 国内老熟妇对白xxxxhd| 亚洲国产精品成人综合色在线婷婷| 中文字幕日韩精品无码内射| 91福利精品在线观看| 亚洲精品www| 青青草手机视频在线观看| 视频一区二区中文字幕| 国产精品一区二区不卡视频| 午夜免费播放观看在线视频| 狠狠色噜噜狠狠狠狠97| www.欧美com| 天天综合精品| 国产精品av电影| 亚洲aaaaaaa| 亚洲自拍偷拍综合| 亚欧精品在线视频| 欧美超碰在线| 国产精品视频yy9099| 飘雪影视在线观看免费观看| 亚洲第一综合色| 超碰人人cao| 午夜精品视频一区二区三区在线看| 日韩av免费在线看| 视频在线不卡| 精品国产鲁一鲁一区二区张丽| 中文在线字幕观看| 欧美fxxxxxx另类| 91免费在线视频网站| 调教视频免费在线观看| 欧美剧情片在线观看| 日本少妇xxxxx| 视频在线观看91| 欧美一级二级三级九九九| 性国裸体高清亚洲| 亚洲毛片在线看| 亚洲第一在线播放| www国产精品av| 国产精品第12页| 免费看av成人| 国产精品国语对白| av午夜在线| 欧美日韩一二三| 蜜桃视频最新网址| 国产真实乱对白精彩久久| 一本久道久久综合狠狠爱亚洲精品| 亚洲成人av观看| 久久黄色av网站| 国产sm主人调教女m视频| 亚洲精品成人天堂一二三| 波多野结衣中文字幕在线播放| 2023国产精品久久久精品双| 97碰碰视频| 狠狠操一区二区三区| 日韩精品在线观看一区二区| 无码人妻一区二区三区线 | 少妇av片在线观看| 免费精品视频在线| 懂色av粉嫩av蜜臀av| 亚洲日本va中文字幕| 91国内精品久久| 国外av在线| 欧美日韩高清一区二区三区| 成人免费黄色小视频| 国产suv精品一区二区6| 免费毛片小视频| 成人影视亚洲图片在线| 91青草视频久久| 成全电影大全在线观看| 亚洲欧美一区二区精品久久久| 久久精品国产亚洲av麻豆蜜芽| 中文字幕成人网| 中文字幕在线观看视频www| 91久久在线| 亚洲图片都市激情| 999国产精品一区| 国产成人精品优优av| 成人在线视频亚洲| 精品视频久久久| 一区二区三区免费观看视频| 国产亚洲精品一区二区| xxxxxx黄色| 天堂午夜影视日韩欧美一区二区| 香蕉久久夜色| 欧美9999| 欧美中文字幕视频| av大全在线| 亚洲欧美国产日韩中文字幕| 亚洲一区中文字幕永久在线| 亚洲午夜激情网页| av女人的天堂| 国产suv精品一区二区三区| 日韩欧美黄色大片| 国产精品激情| 亚洲美女搞黄| 欧美男男freegayvideosroom| 国产精品三级美女白浆呻吟| 不卡的av影片| 日韩一区二区福利| 欧美女子与性| 精品国产污网站| 又骚又黄的视频| 欧美日韩综合视频网址| 天天操天天操天天操天天操天天操| 99r精品视频| 成人三级做爰av| 免费看欧美女人艹b| 男人和女人啪啪网站| 欧美.www| 在线观看免费91| 国产亚洲一区二区三区不卡| 国产美女在线精品免费观看| 成人精品在线| 国产美女高潮久久白浆| 欧美亚洲韩国| 欧美性资源免费| 超碰在线资源| 欧美精品久久久久久久免费观看| 米奇精品一区二区三区| 一区二区福利视频| 噜噜噜在线观看播放视频| 亚洲国产欧美一区二区丝袜黑人| 99久久免费国产精精品| 欧美日韩精品高清| 中文天堂在线播放| 在线看不卡av| 在线免费观看av网址| 色婷婷综合久久久| 黄色一级片免费在线观看| 亚洲伊人伊色伊影伊综合网| 国产波霸爆乳一区二区| 亚洲丝袜自拍清纯另类| 波多野结衣家庭教师在线观看| 久久久91精品国产一区二区精品| 国产性生活毛片| aaa欧美色吧激情视频| 人妻 日韩 欧美 综合 制服| 成人一级片网址| 91视频在线免费| 91网页版在线| 男女黄床上色视频| 久久久久久久久免费| 91网站免费入口| 久久精品人人做人人爽人人| 亚洲av无码国产精品麻豆天美| 久久久久久久精| 亚洲欧美va天堂人熟伦| 日本一区二区三区dvd视频在线| 国产精品天天干| 国产精品久久久久aaaa| 国产男女猛烈无遮挡在线喷水| 综合色天天鬼久久鬼色| 校园春色 亚洲| 亚洲国产成人tv| 国产精品一区二区三区四| 91精品91久久久中77777| 在线观看免费视频a| 91精品国产91久久久久久最新毛片| 国产超碰人人模人人爽人人添| 日韩精品一区二区三区在线播放 | 精品国产乱码久久久久久图片 | 四虎影视精品永久在线观看| 国产这里只有精品| 91成人短视频| 欧美日本亚洲| 五月精品视频| 妞干网视频在线观看| 美女被久久久| 亚洲av无日韩毛片久久| 成人av免费在线观看| 婷婷色一区二区三区| 亚洲欧洲日韩在线| 国产一级在线播放| 欧洲人成人精品| 国产高清第一页| 亚洲美女视频网| 国产写真视频在线观看| 91精品国产91| 国产精品传媒麻豆hd| αv一区二区三区| 国产欧美日韩| 国产成人永久免费视频| 丝袜脚交一区二区| 曰本三级日本三级日本三级| 91麻豆国产福利精品| 日本高清不卡免费| 狠狠躁夜夜躁人人躁婷婷91 | 性欧美1819sex性高清| 亚洲最大成人网色| 蜜桃一区二区三区| 成人午夜免费剧场| 日韩精品91亚洲二区在线观看| 欧美色图校园春色| 中文字幕免费不卡| 日本一区二区三区精品| 日韩欧美在线不卡| 北岛玲日韩精品一区二区三区| 欧美激情高清视频| 欧美成人三级| 欧美日韩综合网| 99国产精品久久久久久久 | 国产成人精品777777| 欧美成人官网二区| 老司机在线看片网av| 国产成人精品久久亚洲高清不卡| 999国产精品一区| 艳母动漫在线观看| 麻豆91在线观看| 国产 欧美 在线| 欧美日韩亚洲激情| 国产成人无码www免费视频播放| 色偷偷噜噜噜亚洲男人的天堂| 欧美成人免费电影| 国产区一区二区三区| 欧美人成在线| 久久婷婷中文字幕| 亚洲婷婷在线视频| 中文字幕视频在线播放| 亚洲欧美一区二区三区在线| 黄色小说在线播放| 91在线免费看片| 欧美一区国产在线| 日本高清免费观看| 亚洲丝袜精品丝袜在线| 国产精品自产拍| 久久精品亚洲热| 欧美成人家庭影院| 色香蕉在线观看| 蜜桃91丨九色丨蝌蚪91桃色| 99久久久无码国产精品衣服| 欧美性极品xxxx做受| 亚洲区小说区图片区| 韩国三级电影久久久久久| 成人av综合网| 日本欧美黄色片| 91视频在线看| 无码人妻熟妇av又粗又大| 亚洲午夜小视频| 成人国产激情在线| 一区二区欧美日韩| 国产在线播放一区| 欧产日产国产v| 亚洲缚视频在线观看| 久草在线资源福利站| 久久影院理伦片| 日韩精品亚洲一区二区三区免费| b站大片免费直播| 欧美欧美欧美欧美首页| 麻豆视频在线免费观看| 91影院在线免费观看视频| 欧美精品首页| 第四色在线视频| 色8久久精品久久久久久蜜| 成在在线免费视频| 成人一区二区电影| 国产综合自拍| 亚洲国产综合视频| 在线观看亚洲一区| 成人a在线视频免费观看| 国产98在线|日韩| 国产精品日本| 欧美一区二区三区粗大| 欧美一区二区三区影视| 91色在线看| 日韩欧美在线电影| 国产精品小仙女| 国产情侣自拍av| 色婷婷av一区二区三区久久| 精品久久国产一区| 乱妇乱女熟妇熟女网站| 国产精品丝袜久久久久久app| 国产精品老熟女视频一区二区| 欧美华人在线视频| 国产日产精品一区二区三区四区的观看方式 | 激情五月综合色婷婷一区二区| 亚洲欧美日韩一区在线观看| 毛片aaaaaa| 亚洲成人精品av| 国产麻豆久久| 国产免费黄色一级片| 国产亚洲va综合人人澡精品| av av片在线看| 清纯唯美日韩制服另类| 91成人免费| 三级网站在线免费观看| 日韩一级免费观看| 88xx成人免费观看视频库| japanese在线播放| 亚洲国产高清不卡|