Linux kernel

Porting Linux Kernel – 將新版 Linux Kernel 移植到舊有平台上進行 Kernel 版本升級

之前的文章有提到,  移植 Linux kernel 的情況依困難程度從難到易列出為下列四種

1. 將 Linux Kernel 移植到全新 CPU architecture 上
2. 將新版 Linux Kernel 移植到全新 SoC 上
3. 將新版 Linux Kernel 移植到全新平台上
4. 將新版 Linux Kernel 移植到舊有平台上進行 Kernel 版本升級

這篇主要分享將新版 Linux Kernel 移植到舊有平台上進行 Kernel 版本升級所需的步驟以及需要注意的地方

此階段的移植, 可以確定硬體具備一定程度的穩定性. 所以移植上若出現問題, 可將除錯聚焦於 kernel 以及週邊驅動程式上 (當然還是有極小部份的例外)

1. 事前準備事項:

  • 已被驗證過的硬體以及週邊元件

→ 確保硬體為移植標的物, 且此標的物已被前版 kernel 驗證過.

  • SoC/ 週邊元件 datasheet

→ 根據硬體料號來找尋對應的最新版 data sheet, 必要時需連絡 FAE.

→ 根據 data sheet 以設定相對應的硬體功能.

  • SoC/ 週邊元件 errata

→ 根據硬體料號來找尋對應的最新版 errata (有些errata會附在 data sheet 後面), 必要時需連絡 FAE 拿取.

→ errata 可以用來協助定位問題, 看要將問題列為功能限制或者找出 in-house patch 以進行 work-around.

  • 前一版正常運行的 Linux kernel, 含 device tree 以及  kernel configuration

→ 若移植出現問題時, 可用來和前一版正常運行的版本比較以確認問題.

→ 可協助找出 in-house patch

  • “最新” mainline Linux kernel, 含 device tree 以及  kernel configuration

→ 若移植出現問題時, 可用來和新版本比較以確認問題.


2. 下載新版本 kernel

可至 kernel 網站下載想要移植的 kernel 版本.

  • kernel newbie 網站會提供每一版 kernel 的新增修改歷程, 建議閱讀從原有版本到欲移植 kernel 每一版中的差異
  • 建議下載 LTS 版本的 kernel

3. 進行移植

將新版 Linux Kernel 移植到舊有平台上進行 Kernel 版本升級主要需要處理的檔案如下:

需要處理的檔案 需要處理原因 解決方法
Device tree
  • dtsi 內容有所異動
  • node property/ value 有所異動
  • 閱讀 dtsi git 修改歷程 (git log/ blame)
  • 閱讀  “Documentation/devicetree/bindings/” 相關文件
  • 閱讀 compatible 裡相對應的 driver
Kernel configuration
  • subsystem 以及底下的Kconfig 項目有所新增刪減修改
  • kernel configuration 中的依賴性有所變更
  • 閱讀該項目 git 修改歷程 (git log/ blame)
  • 比對新舊版的 kernel configuration, 以選取相對應的選項
In-house patch
  • 當前 kernel 不含 in-house patch
  • in-house patch 已進新版 kernel, 但格式有所變異
  • 閱讀 data sheet 以及 errata 來定位問題
  • 根據最新 mainline kernel 並搭配前一版正常運行的 Linux kernel 來移植/ 修改 in-house patch
Proprietary drivers
  • drivers 呼叫的 API 格式有所修改
  • driver 使用的抽像層資料結構有所修改
  • driver 所位於的 subsystem 有所異動
  • 閱讀 git 修改歷程 (git log/ blame)
  • 根據最新 mainline kernel 並搭配前一版正常運行的 Linux kernel 來移植/ 修改 in-house patch
  • 閱讀  “Documentation” 相關文件

進行上述動作前, 請務必使用版本控制系統來管控開發中的 kernel source (推薦使用 git). 讓任何的修改都需有所本.

移植平台時, 請把握三個原則

先選用網路或者易插拔的裝置開機

先使用網路或者易插拔的裝置開機 e.g. tftpboot, USB, SD card 等等. 避免一開始就使用 NAND flash, eMMC, UFS 這種 on-board 的裝置進行開發. 不然一旦開發出現問題, 會耗費許多時間在進行更新.

先移植網路功能 

只要網路先通, 後續在 OS 中更新 kernel image/ device tree 都可以透過網路, 而不需要進行 tftpboot or 插拔 storage 等等的動作.

而網路功能需先設定下列項目

  • Ethernet 相關 PIN MUX
  • PHY dts & device driver
  • Ethernet dts & device driver
√ 設檢查點並進行回歸測試

在開發中後期所移植的功能設定有可能會影響前期的正常功能. 但發現時往往無法追溯究竟是哪一個 commit 所造成. 此情況需要花費許多心力來查找. 所以設檢查點, 進行回歸測試就非常重要.


4. 在標的物上進行測試

√ 更新 kernel image/ device tree

在更新 kernel image/ device tree 時, 請不要直接覆蓋掉原本的 kernel image/ device tree. 先把原本可以正常運行的 kernel image/ device tree 改名 (e.g. uImage.old) 再進行更新.

如此可以避免新版 kernel image/ device tree 出問題開不了機導致需要插拔 storage等等耗費時間的動作. 只需要修改 uboot command 即可進去系統重新更新.

√ 檢查開機訊息
  • 開機訊息中不能有任何 warning /error
  • 系統資訊是否正確 (kernel version, machine model, clocksource等等資訊)
  • 檢查開機時間是否正常. 若有開機過久的情況, 可能 kernel 移植有所問題.
√ 測試遇到問題

請先定位問題, 並先排出硬體, 治具, 測試環境, 測試程式, 網路環境等等的因素.

若是進行 driver debugging, 則可以使用 nfs 來掛載開發中的 driver 目錄. 避免一直進行重覆 copy 的動作.

√ 測試結束

請備份當下 image, 當成 golden sample. 若之後修改有問題, 還有 image 能夠對照.


發表迴響