精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美熟妇另类久久久久久多毛| 欧美一区二区三区精美影视 | 亚洲黄色尤物视频| 风间由美中文字幕在线看视频国产欧美| 成人不卡免费av| 日韩免费观看网站| 日本免费a视频| 午夜性色福利视频| 捆绑调教一区二区三区| 欧美激情精品久久久久久| 真人bbbbbbbbb毛片| 狠狠久久伊人中文字幕| 亚洲第一搞黄网站| 亚洲国产精品123| 蜜桃久久一区二区三区| 日韩二区三区四区| 久久久久久久91| 国产18无套直看片| 久久中文资源| 欧美一卡2卡3卡4卡| 青青在线视频观看| 91精品久久| 久久精品一区二区三区四区| 岛国视频一区免费观看| 在线观看免费视频a| 999在线观看精品免费不卡网站| 日韩在线欧美在线| 日韩精品无码一区二区三区久久久| 国产一区二区高清在线| 欧美这里有精品| 国产青青在线视频| 日韩av激情| 亚洲欧美怡红院| 日韩欧美99| 四虎影视2018在线播放alocalhost| 91精品蜜臀一区二区三区在线| 亚洲激情成人网| 极品人妻一区二区| 先锋影音网一区二区| 一本久道久久综合中文字幕 | 91嫩草在线| 中文字幕+乱码+中文| 国产乱码精品| 97香蕉超级碰碰久久免费软件 | 伊人久久大香线蕉精品组织观看| 亚洲人a成www在线影院| 小毛片在线观看| 北条麻妃一区二区三区在线| 欧美一级在线免费| 中文av字幕在线观看| 国产原创一区| 欧美日韩另类一区| 午夜国产一区二区三区| 日韩久久一区二区三区| 色呦呦一区二区三区| 看av免费毛片手机播放| 久久男人天堂| 精品女同一区二区三区在线播放| avav在线播放| av在线视屏| 午夜电影久久久| 精品无码国模私拍视频| 成人一级福利| 日韩欧美在线网址| 日日摸日日碰夜夜爽无码| 成入视频在线观看| 色94色欧美sute亚洲线路一ni| 国产91对白刺激露脸在线观看| 欲香欲色天天天综合和网| 日韩欧美精品中文字幕| 妓院一钑片免看黄大片| 电影一区二区三| 欧美三级日韩三级| 久久出品必属精品| 97久久亚洲| 亚洲欧美另类国产| 色婷婷国产精品免| 一区二区电影在线观看| 韩国三级日本三级少妇99| 成人免费视频毛片| 秋霞电影网一区二区| 国产色婷婷国产综合在线理论片a| 国产精品久久久久久久久毛片 | 日韩精品欧美激情| 日本少妇xxxxx| 国产一区二区三区精品在线观看| 欧美精品在欧美一区二区少妇| 国内av免费观看| 欧美交a欧美精品喷水| 亚洲图片欧美午夜| 日韩一级片大全| 亚洲美女91| 国产精品一二三视频| 精品人妻无码一区二区色欲产成人 | 久久久久亚洲av成人网人人软件| 婷婷精品视频| www.国产精品一二区| 国产一级av毛片| 男人操女人的视频在线观看欧美| 亚洲一区二区免费| 九九在线视频| 亚洲一区二区在线播放相泽| 日韩av播放器| 韩国精品福利一区二区三区| 国产一区二区三区网站| 欧美三级 欧美一级| 美女91精品| 国产chinese精品一区二区| 国产女人在线视频| 亚洲第一综合色| 超碰在线超碰在线| 国产影视一区| 91国产精品视频在线| 国产伦精品一区二区三区四区 | 疯狂试爱三2浴室激情视频| 一本久久综合| 91精品久久久久久蜜桃| 97超碰人人在线| 精品美女永久免费视频| 日本在线观看视频一区| 精品免费视频| 国产91成人在在线播放| 99国产精品欲| 亚洲欧洲国产日韩| 日本999视频| 欧美大片网址| 欧美极品第一页| 国产哺乳奶水91在线播放| 国产精品区一区二区三| 午夜精品久久久内射近拍高清| youjizz亚洲| 欧美成人激情视频| 国产精品久久久久久久久久久久久久久久 | 亚洲一区免费看| 免费高清视频在线一区| 日韩精品在线电影| 91精品国产乱码在线观看| 国产suv精品一区二区6| 男人j进女人j| 日本超碰一区二区| 欧美久久精品午夜青青大伊人| 亚洲一区在线观| 中文成人av在线| 香港日本韩国三级网站| 青青草91久久久久久久久| 国产成人高潮免费观看精品| 青草久久伊人| 色婷婷综合久久久中文字幕| 手机av免费看| 在线亚洲成人| 欧美第一黄网| 精品3atv在线视频| 在线日韩日本国产亚洲| 中国黄色一级视频| 亚洲欧洲韩国日本视频| 永久av免费在线观看| 欧美精品国产一区二区| 国产不卡一区二区三区在线观看| 青青青国内视频在线观看软件| 日韩网站在线看片你懂的| 欧美激情精品久久| 成人午夜电影久久影院| 大陆极品少妇内射aaaaa| 日韩电影在线观看完整免费观看| 91国产精品电影| 麻豆导航在线观看| 欧美日韩国产另类一区| av成人免费网站| 成人午夜短视频| 免费av网址在线| 日韩在线看片| 99久久一区三区四区免费| www.youjizz.com在线| 亚洲欧美精品伊人久久| 亚洲中文字幕一区二区| 依依成人综合视频| 鲁大师私人影院在线观看| 日本视频中文字幕一区二区三区| 在线一区高清| 精品国产乱子伦一区二区| 日韩av日韩在线观看| 日本网站在线免费观看视频| 日韩三级在线观看| 欧美一区二区三区网站| 国产精品夫妻自拍| 一本色道久久hezyo无码| 久久久久看片| 日本a在线天堂| 国产传媒欧美日韩成人精品大片| 亚洲va久久久噜噜噜| 欧美xxxhd| 久久夜精品香蕉| 香蕉人妻av久久久久天天| 欧美日韩一级片网站| 国产午夜精品一区二区理论影院 | 麻豆国产在线| 色偷偷综合社区| 日本黄色三级视频| 欧美日韩激情在线| 国产成人亚洲精品自产在线| 国产精品国产自产拍高清av| 日韩综合第一页| 久久国产综合精品| 免费黄色日本网站| 欧美精品国产一区| 亚洲视频精品一区| 视频小说一区二区| 97欧洲一区二区精品免费| 亚洲四虎影院| 97视频在线观看成人| av黄色在线| 中文字幕在线看视频国产欧美在线看完整| 亚洲精品视频91| 欧美一三区三区四区免费在线看| av毛片在线免费观看| 亚洲高清中文字幕| 日韩在线中文字幕视频| 中文字幕精品在线不卡| 美女又爽又黄视频毛茸茸| 国产精品91一区二区| 日本美女高潮视频| 噜噜噜躁狠狠躁狠狠精品视频| 黄色一级片黄色| 一本一本久久a久久综合精品| 日韩一本精品| 国内亚洲精品| 欧美在线一二三区| 色吊丝一区二区| 国产主播一区二区三区四区| 999精品视频在线观看| 国产精品免费一区二区三区都可以| 国产极品在线观看| 久久久久久久久国产精品| www.在线视频| 久久国产精品99国产精| 黄色成人影院| 久久久久99精品久久久久| 午夜视频在线| 俺去了亚洲欧美日韩| 欧美69xxxx| 久久久精品国产亚洲| 麻豆91在线| 久久久国产一区| a级毛片免费观看在线| 久久亚洲电影天堂| av网站在线免费看推荐| 久精品免费视频| 牛牛在线精品视频| 久久久久久久久久国产精品| 神马午夜伦理不卡| 久久久久久久999精品视频| 大黄网站在线观看| 97在线日本国产| 老司机2019福利精品视频导航| 欧美孕妇孕交黑巨大网站| 九色porny视频在线观看| 91精品国产高清久久久久久| 在线观看网站免费入口在线观看国内| 69视频在线免费观看| xx欧美视频| 国产这里只有精品| 欧美大片91| 黑人另类av| 国产欧美日韩在线一区二区| 亚洲国产日韩综合一区| 99久久www免费| 国产片侵犯亲女视频播放| 国产欧美丝祙| 啊啊啊国产视频| 激情五月激情综合网| 国产裸体视频网站| 91蜜桃网址入口| 少妇无套高潮一二三区| 综合激情成人伊人| 97超碰人人干| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美精选一区| 青青草原av在线播放| 人人精品人人爱| 91超薄肉色丝袜交足高跟凉鞋| 91麻豆swag| 亚洲天堂网av在线| 精品福利免费观看| 亚洲一区二区激情| 亚洲国产另类久久精品 | 久久福利视频网| 波多野结衣久久精品| 成人午夜在线观看| 少妇久久久久| 精品一区二区成人免费视频| 亚洲免费播放| 又黄又爽又色的视频| 久久色.com| 久久精品国产亚洲av高清色欲| 在线中文字幕一区二区| 成人久久久精品国产乱码一区二区 | 99精品全国免费观看视频软件| 福利视频免费在线观看| 日韩电影一区二区三区| 中文字幕天堂av| 综合中文字幕亚洲| 五月天婷婷导航| 精品国产a毛片| 欧美jizz18hd性欧美| 欧美一级黄色网| 91精品久久久久久综合五月天| 日韩av一区二区三区美女毛片| 国产综合自拍| 国产永久免费网站| 国产亚洲一区二区在线观看| 久久黄色小视频| 制服丝袜中文字幕亚洲| 国产女人在线视频| 91av视频在线播放| 99久久人爽人人添人人澡| 在线观看欧美亚洲| 日韩国产欧美在线观看| 黄色录像a级片| 亚洲香蕉伊在人在线观| 国产视频手机在线观看| 最近2019中文字幕一页二页 | 免费在线观看av网站| 国产91网红主播在线观看| 成人在线视频你懂的| 黄色网址在线免费看| 免费在线观看精品| 精品人妻一区二区三区视频| 一区二区三区丝袜| 国产精品久久久久久免费免熟| 这里只有精品视频在线| 外国成人直播| 欧美一区二视频在线免费观看| 亚洲欧美日韩国产一区| 国产精品久久久久久在线观看| 一区二区三区在线免费| 999av视频| 欧美成人剧情片在线观看| www.欧美| 国产女人18毛片| 国产酒店精品激情| 91视频综合网| 6080午夜不卡| 亚洲按摩av| av一区二区三区在线观看| 午夜精品婷婷| 大尺度在线观看| 午夜精品视频一区| 青青草免费在线| 国产精品jizz在线观看麻豆| 精品中文一区| 人人爽人人av| 国产精品不卡在线观看| 92久久精品一区二区| 欧美成人免费播放| 国产欧美三级电影| 99999精品视频| 国产精品系列在线| 99热这里精品| 久久久久久国产精品美女| 小说区图片区色综合区| 久久久久久香蕉| 中文字幕欧美一区| 成人黄色在线观看视频| 91精品国产高清自在线 | 97久久精品人人做人人爽| 国产精品自拍99| 亚洲最新av在线| 国产精品日本一区二区三区在线| 成人在线观看毛片| www.日韩av| 99成人精品视频| 久国内精品在线| 国产成人精品一区二区免费看京 | 丰满人妻一区二区三区53号| 白白色亚洲国产精品| 无码人妻精品一区二区蜜桃色欲| 日日摸夜夜添一区| 白嫩白嫩国产精品| 国产精品igao| 一区二区成人在线| 男女视频在线观看| 91欧美精品午夜性色福利在线| 亚洲日本免费| 污污视频网站在线免费观看| 日韩欧美国产综合在线一区二区三区| 国产资源在线观看入口av| 欧美日韩在线高清| 国产一区二区三区高清播放| www.国产高清| 欧美成人免费小视频| 日韩美女国产精品| 天堂视频免费看| 欧美日韩国产一区二区| 麻豆网站在线看| 麻豆精品视频| 国产传媒日韩欧美成人| 看黄色一级大片| 国内精品视频一区| 97精品国产福利一区二区三区| 中文字幕精品视频在线|