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内核中加解密流程的组织、数据结构和关键步骤,以确保不同算法在复杂环境下的高效、安全执行。