日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

【文件系统异常】升级导致文件系统异常总结

發布時間:2024/2/2 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 【文件系统异常】升级导致文件系统异常总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件系統異常原因:設備存在壞塊,導致寫入內容錯位,設備存在壞塊,壞塊的位置無法正常寫入

目前我們路由器設備使用Nandflash內存的型號有 UR3X、UR5X

一、壞塊的原因

NAND Flash產生壞塊原因
由于NAND Flash的工藝不能保證NAND的Memory Array在其生命周期中保持性能的可靠,因此,在NAND的生產中及使用過程中會產生壞塊。壞塊的特性是:當編程/擦除這個塊時,不能將某些位拉高,這會造成Page Program和Block Erase操作時的錯誤,相應地反映到Status Register的相應位。

二、壞塊的種類
1.固有壞塊
這是生產過程中產生的壞塊,一般芯片原廠都會在出廠時都會將壞塊第一個page的spare area的第1個或者6個byte標記為不等于0xff的值,標記在哪一位是根據page的大小決定的。
2.使用中產生的壞塊
這是在NAND Flash使用過程中,如果Block Erase或者Page Program錯誤,就可以簡單地將這個塊作為壞塊來處理,這個時候需要把壞塊標記起來。為了和固有壞塊信息保持一致,將新發現的壞塊的第一個page的spare area的第1個或者6個Byte標記為非0xff的值。

我們了解了NAND Flash出廠時在spare area中已經反映出了壞塊信息,因此,如果在擦除一個塊之前,

① 一定要先check一下spare area的第1或者第6個byte是否是0xff,如果是就證明這是一個好塊,可以擦除;

② 如果是非0xff,那么就不能擦除。當然,這樣處理可能會犯一個錯誤―――“錯殺偽壞塊”,因為在芯片操作過程中可能由于電壓不穩定等偶然因素會造成NAND操作的錯誤。但是,為了數據的可靠性及軟件設計的簡單化,我們就要奉行“蔣委員長”的“寧可錯殺一千,也決不放過一個”的宗旨。
補充說明:
  1.需要對前面由于Page Program錯誤發現的壞塊進行一下特別說明。如果在對一個塊的某個page進行編程的時候發生了錯誤就要把這個塊標記為壞塊,首先就要把其他好的page里面的內容備份到另外一個空的好塊里面,然后,把這個塊標記為壞塊。當然,這可能會犯“錯殺”之誤,一個補救的辦法,就是在進行完頁備份之后,再將這個塊擦除一遍,如果Block Erase發生錯誤,那就證明這個塊是個真正的壞塊,那就毫不猶豫地將它打個“戳”吧! (也就是雙重驗證證明當前的塊是壞塊)
  2.可能有人會問,為什么要使用spare area的第一個或者第六個byte作為壞塊標記。這是NAND Flash生產商的默認約定的,但是也不一定必須得是第一或者第六個byte,只是這兩者情況用的比較多而已。

三、路由器文件系統異常根本原因

eg.

當前我們的路由器設備,先有uboot系統后才往內燒錄ext2文件,最后才能進行升級bin文件

燒錄ext2文件時候 燒錄的過程是一整片一整片的燒錄到固定的位置,ext2的燒錄內容=(bin的內容+填充內容)

填充的部分是預留的為了以后有新功能擴展的時候能夠使用是固定的大小接在位置鏡像內容的后面,如果說當前有壞塊,則寫內容會往后移動,那對應的填充內容部分也會往后移動,比如假設我們的kernel大小是7M,此時如果一個壞塊是128k,則最后的位置是7M+128k

但是我們升級的時候 使用的是bin文件

(燒錄是一塊一塊的升級先升級完dtb、再升級kernel、接著升級rootfs,然后解壓升級工具壓縮包)

這時候的燒錄根據鏡像真實的大小寫到哪里就到哪里,但是原先的ext2的填充還是存在,

但是我們讀取文件的位置是固定的 如上圖劃分的那樣,倘若當前的劃分區域存在壞塊,則會出現以下的情況出現

因此,我們可以知道 引起文件系統異常的根本原因:系統讀取數據和寫入數據的位置不一致導致文件系統讀取異常

修改內容:

原先我們寫reserved區域的時候使用的命令是dd,dd只能 if 接指定文件,of 接硬盤符,遇到壞塊直接無法正常寫入,現在使用dd命令改為mtd命令處理,則當前可以跳過壞塊進行讀寫,除非遇到當前壞塊大小超過整個存儲空間大小的情況,才會無法正常寫入

四、如何標記正常的塊為壞塊模擬壞塊問題的產生

使用dmesg命令我們可以從中發現當前的分區情況如下

[    1.175148] 0x00000 0000000-0x0000 00040000 : "dtb"  
[    1.183245] 0x00000 0040000-0x0000 00700000 : "kernel"
[    1.192491] 0x00000 0700000-0x0000 07a00000 : "rootfs"
[    1.204027] mtd: device 2 (rootfs) set to be root filesystem
[    1.214492] 1 squashfs-split partitions found on MTD device rootfs
[    1.220817] 0x0000 01be0000-0x0000 07a00000 : "rootfs_data"
[    1.232020] 0x0000 07a00000-0x0000 07f00000 : "backup"
[    1.241297] 0x0000 07f00000-0x0000 08000000 : "reserved"
[    1.250258] gpmi-nand 1806000.gpmi-nand: driver registered.

  

已知當前的分區地址,一塊地址是128 k,那么怎么知道下一個地址是什么?

如標記壞塊在第一個dtb塊

如果要計算當前的區域大小可以這樣計算

16進制轉換成10進制,計算一下大小可以這樣計算單位是B,再除以1024把單位變成k 大小一共是 256k一塊固定是128k,可以算出是多少塊 根據dtb

可以計算出當前有2塊

dtb的地址是0000000 - 00040000 因為當前是2塊 所以可以知道中間有一塊地址是00020000

進入uboot模式

1、標記壞塊

=> nand markbad off 00020000

block 0x00000000 successfully marked as bad

block 0x00020000 successfully marked as bad

2、查詢當前的壞塊

=> nand bad

3、擦除壞塊標記

=> nand scrub -y 0xa0000 0x20000

NAND scrub: device 0 offset 0xa0000, size 0x20000

please enter erase passwd:ursalink521125

Erasing at 0xa0000 -- 100% complete.

OK

擦除壞塊第一個是要擦除的起始地址 后面是要擦除的位置大小

在uboot下 nand 可以直接看到當前nand的用法

經過實驗,如果壞塊區域在dtb 則系統直接異常

因為當前uboot的寫是會跳過壞塊去寫,但是讀是按照固定位置去讀的,因為壞塊所以dtb寫到了kernel的占位,當前的kernel讀到的內容是dtb的內容導致當前系統異常 無法正常啟動

總結

以上是生活随笔為你收集整理的【文件系统异常】升级导致文件系统异常总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。