使用NVRAM的簡單解決方案

2021-10-09 10:51:01 字數 1294 閱讀 7921

許多**商提供專為nvram使用的現成檔案系統軟體。除非要求某些專門功能,否則開發人員自行設計在經濟上會所產生的問題。資料結構的儲存主要是針對特定應用程式的,因此將進一步解決。

非易失性使用普通的易失ram很簡單。上電時必須將其初始化為乙個已知值,然後可以根據需要對其進行寫入和讀取。借助nv-sram,面臨兩個新挑戰:

•開機時,軟體需要識別nvram是否已初始化,如果尚未初始化,請執行該初始化。

•資料的完整性,尤其是斷電一段時間後,需要進行驗證。

nvram初始化

首次啟動nvram時,就像普通ram一樣,它包含不確定的資料,需要初始化。在隨後的情況下,軟體需要識別nvram已初始化,並且不會覆蓋此儲存的資料。

進行這種識別的最簡單方法是使用簽名,該簽名只是可以快速識別的位元組序列,不能隨機出現。這種理想是不可能的,因為任何位元組序列(無論多長)都可能隨機發生。只是最大程度地減少這種可能性,同時仍然使檢查變得快捷容易。如果簽名只有4個位元組,則隨機發生簽名的可能性為40億比1。對於幾乎所有可以想象的應用程式來說已經足夠了。並且可以快速檢查32位值。

通過仔細選擇簽名值便可以減少意外發生的機會。乙個連續的數字序列(例如1、2、3、4)比「隨機」集合感覺不太可能。畢竟彩票最後一次是什麼時候產生連續的數字序列的?當然這種序列與其他序列一樣可能或不太可能。但是通過考慮記憶體的工作方式,特定序列的可能性可能會增加。首次開機時的記憶體可能具有哪些值?大致有四種可能性:

1、完全隨機

2、全零

3、所有的

4、一些反映晶元架構的規則模式(例如交替的1和0)

如果為(1),那麼任何簽名都會給我們40億比1的機會。其他任何乙個都可以通過使用正確的簽名來檢測。可能的情況如下:0x00、0xff,0xaa,0x55​​。這應該覆蓋所有(2),(3)和(4),但仍僅為32位。

初始化序列需要謹慎。設定有效資料,然後將簽名初始化為過程中的最後一件事是至關重要的。

非易失性nv-sram完整性

當然,使用簽名並不能保證資料的完整性。使用校驗和或crc進行錯誤檢查,甚至使用資料自校正機制都是明智的。

使用nvram進行系統啟動

當使用nvram時,啟動邏輯需要容納簽名驗證和資料完整性檢查:

結論在嵌入式設計中使用nvram很簡單,但是確實需要按此處所述小心地適應其功能。使用全域性簽名和錯誤檢查的方法適用於許多應用程式。對於非常大的資料庫,單獨檢查每個資料塊可能會更有效率。使用c ++對應用程式**開發人員隱藏nvram管理,從而最大程度地減少程式設計師錯誤的可能性,也可能是值得的。

mysql 解決方案 Mysql解決方案

mysql解決方案 一 centos7安裝mysql5.7 wget rpm uvh mysql80 community release el7 3.noarch.rpm yum repolist all grep mysql 發現預設mysql8.0是預設安裝的,然而我們要安裝的是mysql5.7...

SpringCache的使用,快取解決方案

官網 cache org.springframework.boot spring boot starter cache 如果想要使用redis的快取,再引入redis org.springframework.boot spring boot starter data redis 自動配置了哪些呢?c...

求 簡單的SQL併發解決方案

併發的時候,如何避免重複取同一條記錄?直接看 declare id int select top 1 id id from redpackage order by id update redpackag set zt 已領取 where id id 當100個執行緒同時開時,發現都是更新同一條記錄 ...