使用 spi-intel 升級 BIOS

許多英特爾 CPU,例如 Baytrail 和 Braswell,都包含 SPI 序列快閃記憶體主控制器,用於儲存 BIOS 和其他平臺特定資料。由於 SPI 序列快閃記憶體的內容對於機器的正常執行至關重要,因此它通常受到不同的硬體保護機制的保護,以避免意外(或故意)覆蓋內容。

並非所有制造商都保護 SPI 序列快閃記憶體,主要是因為它允許直接從作業系統升級 BIOS 映像。

如果某些保護位未設定且未鎖定,spi-intel 驅動程式就可以讀寫 SPI 序列快閃記憶體。如果發現其中任何一個已設定,整個 MTD 裝置將變為只讀,以防止部分覆蓋。預設情況下,驅動程式將 SPI 序列快閃記憶體的內容暴露為只讀,但可以透過核心命令列傳遞“spi_intel.writeable=1”來更改。

請記住,覆蓋 SPI 序列快閃記憶體上的 BIOS 映像可能會導致機器無法啟動,並需要 Dediprog 等專用裝置才能恢復。特此警告!

以下是直接從 Linux 升級 MinnowBoard MAX BIOS 的步驟。

  1. 下載並解壓最新的 Minnowboard MAX BIOS SPI 映像 [1]。截至撰寫本文時,最新映像是 v92。

  2. 安裝 mtd-utils 軟體包 [2]。我們需要它來擦除 SPI 序列快閃記憶體。像 Debian 和 Fedora 這樣的發行版預裝了名為“mtd-utils”的軟體包。

  3. 將“spi_intel.writeable=1”新增到核心命令列並重啟主機板(你也可以透過將“writeable=1”作為模組引數傳遞給 modprobe 來重新載入驅動程式)。

  4. 主機板再次啟動並執行後,找到正確的 MTD 分割槽(它被命名為“BIOS”)

    # cat /proc/mtd
    dev:    size   erasesize  name
    mtd0: 00800000 00001000 "BIOS"
    

    因此這裡是 /dev/mtd0,但它可能有所不同。

  5. 首先備份現有映像

    # dd if=/dev/mtd0ro of=bios.bak
    16384+0 records in
    16384+0 records out
    8388608 bytes (8.4 MB) copied, 10.0269 s, 837 kB/s
    
  6. 驗證備份

    # sha1sum /dev/mtd0ro bios.bak
    fdbb011920572ca6c991377c4b418a0502668b73  /dev/mtd0ro
    fdbb011920572ca6c991377c4b418a0502668b73  bios.bak
    

    SHA1 和必須匹配。否則,請勿繼續操作!

  7. 擦除 SPI 序列快閃記憶體。完成此步驟後,請勿重啟主機板!否則它將無法再啟動

    # flash_erase /dev/mtd0 0 0
    Erasing 4 Kibyte @ 7ff000 -- 100 % complete
    
  8. 如果沒有錯誤地完成,你就可以寫入新的 BIOS 映像

    # dd if=MNW2MAX1.X64.0092.R01.1605221712.bin of=/dev/mtd0
    
  9. 驗證 SPI 序列快閃記憶體的新內容與新的 BIOS 映像是否匹配

    # sha1sum /dev/mtd0ro MNW2MAX1.X64.0092.R01.1605221712.bin
    9b4df9e4be2057fceec3a5529ec3d950836c87a2  /dev/mtd0ro
    9b4df9e4be2057fceec3a5529ec3d950836c87a2 MNW2MAX1.X64.0092.R01.1605221712.bin
    

    SHA1 和應該匹配。

  10. 現在你可以重啟主機板,並觀察新的 BIOS 是否正常啟動。

參考

[1] https://firmware.intel.com/sites/default/files/MinnowBoard%2EMAX_%2EX64%2E92%2ER01%2Ezip

[2] http://www.linux-mtd.infradead.org/