linuxtag
❶ 小白自製linux開發板 三. Linux內核與文件系統移植
Linux內核移植與文件系統構建過程
對於F1C100S/F1C200S,Linux官方源碼提供了licheepi nano的支持。我們可以通過使用licheepi nano的配置文件來完成內核移植。
首先,進入Linux系統官網下載最新長時間支持版本(推薦5.10.69)或根據個人需要選擇其他版本。在新頁面中,選擇【summary】,點擊【tag】中的【...】進行下載。下載完成後,將代碼復制到Ubuntu虛擬機並解壓。
接下來配置編譯過程。在VS中打開Linux內核代碼,找到Makefile文件並進行如下配置:指定架構為Arm,使用已安裝的編譯工具。修改Makefile中的ARCH 和 CROSS_COMPILE欄位,或直接在make命令中加上對應參數。進行內核配置,使用licheepi_nano的配置文件替換sunxi_defconfig,並完成內核和設備樹的編譯。
為了確保TF卡設備樹的正確配置,我們需要修改suniv-f1c100s.dtsi和suniv-f1c100s-licheepi-nano.dts文件。通過在根節點添加代碼確保設備樹正確識別硬體。
在編譯過程中,可能會因Ubuntu系統差異遇到編譯錯誤,可以通過復制錯誤信息並安裝缺失組件解決。首次編譯可能需要較長時間,完成後,內核文件zImage和設備樹文件suniv-f1c100s-licheepi-nano.dtb將生成。
為TF卡配置分區,通過Gparted軟體新建兩個分區,一個用於存放內核文件和設備樹文件,另一個用於根文件系統。選擇fat16和ext4格式,並配置相應卷標。完成分區後,使用文件管理器查看掛載的兩個分區。
將生成的內核文件和設備樹文件復制到TF卡的BOOT分區。插入開發板,重啟後,系統將自動進入內核啟動環節,此時需要確保文件系統正確掛載。
接下來進行文件系統移植。選擇Buildroot工具製作文件系統,通過官網下載buildroot2018.2.11版本並解壓。配置Target options、Build options、Toolchain和System configuration,確保系統兼容性。執行構建文件系統命令,等待完成。
將最終生成的rootfs.tar文件解壓到TF卡的第二分區。插入TF卡,進入root賬號後,系統將成功掛載根文件系統,進入shell交互環境。
對於命令行前置顯示#號的問題,修改/etc/profile文件以實現與常規Linux相同的操作體驗。在開發板運行過程中,需執行命令正常關閉系統,否則可能造成文件系統損壞。
完成內核和文件系統的移植後,我們可以通過Linux的GPIO系統在小開發板上實現LED燈的點燈實驗。配置文件系統,修改相關命令,編譯完成rootfs後重新寫入開發板。了解GPIO編號和值的計算方式,通過shell命令操作LED燈。
最後,雖然當前實現的點燈實驗較為基礎,但它是Linux內核功能的初步應用。未來,我們計劃升級硬體設備並進行更深入的開發。讓我們期待接下來的探索吧!
❷ linux加解密框架(四)加解密流程
本文基於以下軟硬體假定:
架構:AARCH64
內核版本:5.14.0-rc5
Linux內核中加解密流程涉及到對稱加解密、hash(mac)、aead等不同類型演算法的處理。這些演算法在加解密流程中的具體實現各有差異,主要體現在以下方面:
- 對稱加解密、mac以及aead等演算法需要密鑰,而hash演算法不需要。
- 一般加解密演算法需要初始向量(iv值),以增強安全性,而ecb模式則不需要。
- aead演算法支持多種icv長度,初始化演算法上下文時需指定icv(tag)長度,其他演算法則不需。
- aead演算法加密時需要包含assoc數據,解密時需包含icv(tag)數據。
- 不同加解密演算法的操作函數可能不同,如加密和解密函數、init、update、final等。
為了適應上述差異,內核將加解密流程劃分為三個層次:加解密核心、加解密類型和加解密驅動。加解密核心實現通用功能,加解密類型實現特定演算法的附加功能,加解密驅動則實現具體演算法的全部功能。
內核使用一系列數據結構描述演算法屬性,以skcipher演算法類型和aes_generic演算法實現為例,其關系如下:
- crypto_alg:唯一標識注冊到內核中的演算法,包含公共屬性如block size、數據對齊長度、演算法優先順序、演算法名、演算法驅動名,以及回調函數。
- skcipher_alg:skcipher特定結構,包含crypto_alg與skcipher特有的屬性和回調函數,如密鑰長度限制、iv長度、密鑰設置、加密和解密回調等。
- crypto_tfm:動態實例,創建時需要密鑰、aead的tag size等上下文信息,用於驅動加解密引擎。
- crypto_skcipher:skcipher動態實例,包含crypto_tfm和特定演算法類型的屬性。
- crypto_async_request:保存加解密參數的結構,用於執行操作。
內核還支持並行操作,如在smp系統上多核並行加解密,或硬體引擎支持多通道並行執行。為此,內核提供crypto_async_request結構,用於保存每次操作的參數。
skcipher流程包括結構體分配、參數准備、上下文設置、請求參數設置和實際操作執行。關鍵步驟如下:
- crypto_alloc_skcipher:分配並初始化crypto_skcipher結構。
- skcipher_request_alloc:根據crypto_tfm分配並初始化請求結構。
- alloc_cipher_test_sglists:為源/目的數據分配scatterlist內存。
- crypto_skcipher_setkey:設置密鑰。
- build_cipher_test_sglists:創建sglist。
- skcipher_request_set_callback:設置回調函數。
- skcipher_request_set_crypt:設置加解密參數。
- crypto_skcipher_encrypt:執行加密操作。
類似地,hash流程也包括tfm和request分配、密鑰設置(取決於演算法)、sglist填充和摘要值生成。
本文詳細介紹了Linux內核中加解密流程的組織、數據結構和關鍵步驟,以確保不同演算法在復雜環境下的高效、安全執行。