基于ubuntu_base构建文件系统
写在开头经常搞 Liunx 的人都知道,文件系统是 Liunx 不可或缺的一部分,难免会遇到需要自己定制一个文件系统的情形,本篇文章就是讲述了基于 ubuntu_base 来定制一个文件系统的方法。
环境准备
如果想要构建的文件系统和构建时所用的平台不一样,则需要创建一个模拟环境,创建也很简单,安装 qemu-user-static 即可。例如apt install qemu-user-static。
获取 ubuntu_base,直接从官网下载即可,如果访问异常就挂一个代理,至于版本选择,一般情况选新不选旧,但也要结合你的实际情况。
配置根文件系统以 ubuntu-base-24.04.1-base-arm64 为例:
解压根文件系统: tar -xvf ubuntu-base-24.04.1-base-arm64 -C 目标文件夹
为根文件系统配置网络: cp /etc/resolv.conf ubuntu-base-24.04.1-base-arm64/etc/resolv.conf
更换 apt 的软件源: sudo vim ubuntu-base-24.04.1-ba ...
扩充ext4镜像的几种方法
写在开头使用 ext4 镜像作为文件系统时,如果需要向其中添加某些大型文件,则可能会遇到镜像空间不足的问题,本篇尝试对此给出几种解决方案。
无大小对齐要求的扩容如果对最终的大小没有对齐要求,则可以直接采用如下方式:
创建一个空的镜像,需求扩容多大创建多大:dd if=/dev/zero of=blank.ext4 bs=1M count=需求大小
将额外的空白文件追加到镜像文件中:cat blank.ext4 >> myimage.ext4
修复文件系统:e2fsck -f myimage.ext4
调整文件系统大小:resize2fs myimage.ext4
有大小对齐要求的扩容操作如果对最终的大小有对齐要求,则推荐创建一个指定大小的空的ext4新镜像,将旧镜像内容复制到新的镜像中:
创建一个空的镜像,需求扩容多大创建多大:dd if=/dev/zero of=myimage.ext4 bs=1M count=需求大小
在空镜像上建立ext4文件系统:mkfs.ext4 myimage.ext4
将空镜像、旧镜像挂载:1234mkdir myimagesudo m ...
uboot-FIT-image 学习
背景FIT image 是嵌入式常用的 bootloader 为了响应 ARM Unify Kernel 而推出的一种镜像格式,其本质是内核、设备树、文件系统合并成一个文件的镜像,并且其中可能包含多个内核、设备树、文件系统等。Unify Kernel 是指将同一内核运行在不同的硬件平台之上。即编译 Linux 内核无需指定具体架构和SOC,其如何兼容不同开发板、平台由 DTB 完成。Bootloader 在启动时,根据硬件环境、选择不同的 DTB 文件,即可使 Linux Kernel 运行在不同的硬件平台上。
FIT-image 简介正如上所说,为了支持 ARM 的 Unify Kernel 构想,需求 Bootloader 提供选择不同 DTB 的能力,过去我们一般都是自行通过 FATLOAD 将需要的 DTB 加载到内存的指定位置,然后通过 BOOTM {Kernel_addr} - {DTB_addr} 来完成这项工作的。
Uboot 为了简化这种过程,推出了全新的 Image 格式 —— FIT uimage,来自动化上述过程。其中 FIT 是指 Flattened Ima ...
ARM-Trusted-Firmware 学习
前言在 ARMv8 之后,Uboot 在启动前需要先进行 ATF 的初始化,为了充分了解启动过程,对 ATF 进行了一波学习,总结在此篇文章中。
ATF 概念安全是操作系统领域这些年经常提到的话题,TF(Trusted Firmware)是 ARM 为了提升安全在 ARMv8 引入的安全解决方案,其包括了启动和运行过程中的特权级划分。由于 TF 是 ARM 引入,所以也叫 ATF,其实现上有两种 Profile,对 arm-a 系列的 TF-A,对 arm-m 系列的 TF-M,由于 a 系列使用较多的原因经常不区分 ATF 和 TF-A。
其作用是细化了特权级,帮助进行安全侧与非安全侧的切换,如下图所示,EL3 即为 ATF 的一部分。
在实现上,EL0 和 EL1 是 ATF 必须实现的,EL2 和 EL3 可选。EL0-EL2 每一个层次又可以分为安全和非安全两部分,EL3 只有安全模式一种。
ATF 的作用是建立一套从启动到执行的信任链,借此提高 ARM 架构的安全性。
ATF 功能过去的 ATF 只是为了电源管理,以及 Trust_zone 的切换,现在随着技术的不断发展, ...
ATF Uboot Linux 交叉编译命令留档
交叉工具链配置1234# 下载需要的交叉编译链# 解压到目录# 加入环境变量 /etc/profileeg: export PATH=$PATH:/home/hangqi-ren/tools/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin:/home/hangqi-ren/qemu/qemu-7.2.12/build
Uboot 编译1234567# 拉取 2022.10 版本的 Uboot 且只拉取最新的 Commit.git clone https://github.com/u-boot/u-boot.git --depth 1\ --branch v2022.10# 生成 .config 文件make qemu_arm64_defconfig# 交叉编译make -j$(nproc) CROSS_COMPILE=aarch64-none-linux-gnu-
Linux 编译1234567891011121314# 官网下载 Linux 任意版本源码https://cdn.kernel.org# 使用默认配置mak ...
ARM-Gicv2 第四章学习
第四章标题是编程模型
该章主要介绍了寄存器位置、每个寄存器的详细用法。建议当工具章进行查阅使用,所以未进行深入学习,这里放一个 GICV2 文档链接。
Gicv2-Spec
ARM-Gicv2 第三章学习
多核处理不同中断
SGI:N-N 模型。
外设中断:1-N 模型。识别支持的中断GICD_ISENABLERn访问 GICD_ISENABLERn,来了解 GIC 目前支持那些中断,GICD_ISENABLER0[15:0] 对应 SGI 0-15,GICD_ISENABLER0[31:16] 对应 PPI 16-31。以此类推 GICD_ISENABLE1[31:0] 对应 SPI 32 - 63。
对于一个中断,如果不被支持,则对应的寄存器位读为0且写无效;如果支持且永久启用,对应的寄存器读为1且写无效,其余的读写规则:
操作方法
访问 GICD_TYPER.ITLinesNumber 揭示有多少数量的 GICD_ISENABLER。
写 GICD_CTLR 来禁用分发器分发中断
对于每个 GICD_ISENABLER 的位对应的中断,利用不支持则写无效原则,写 0xffffffff 给寄存器,再次读寄存器,读出 1 则可知道支持的中断号。
识别永久启用的中断GICD_ICENABLERn访问 GICD_ICENABLERn,来了解 GIC 目前关闭哪些中断,其是 GICD_ ...
ARM-Gicv2 第二章学习
GIC 组成分发器 Distributor分发器的功能是定义优先级和将中断分发给GIC的CPU结构,其寄存器以 GICD_ 前缀识别。
CPU 接口介绍每个 CPU 接口层提供优先级掩码和抢占处理,其寄存器以 GICC_ 前缀识别。
虚拟 CPU 接口虚拟接口控制器最主要部分是一套寄存器,包含一个当前虚拟机正在处理和等待的中断表。一般情况下,这些寄存器被运行在此处理器上的Hypervisor管理,以 GICH_ 前缀识别。
虚拟 CPU 接口每个虚拟 CPU 接口对于虚拟中断提供物理信号对于连接到的处理器。ARM 处理器虚拟化扩展将这些中断信号发送到当前处理器正在执行的虚拟机上。虚拟CPU接口的寄存器可以被虚拟机访问,提供中断控制和状态信息。格式类似于 CPU 接口,以 GICV_ 前缀识别。在实现了虚拟化扩展的GIC中,Hypervisor有义务在切换虚拟机时切换 GICH 中存储的信息。
图示
Distributor功能分发器集中所有的中断源,确定每个中断的优先级,并为每个CPU接口转发具有最高优先级的中断到该接口,以进行优先级屏蔽和抢占处理。
可配置参数
全局启用中断分发。
开 ...
ARM-Gicv2 第一章学习
介绍GIC 功能
为管理中断资源、中断行为进行注册,并对中断进行路由。
支持 ARM 安全扩展、虚拟化扩展
启用、禁用来自硬件的中断
SGI(软件中断)
中断掩码和优先级设置
在电源管理环境中产生唤醒事件。GIC 分组
将每个中断配置为组 0 或者组 1。
将组 0 的中断以 IRQ 或者 FIQ 的形式发到处理器。
将组 1 的中断以 IRQ 的形式发送到处理器。
以一个统一的表来处理组0组1中断的优先级。
对组0的某些中断可以锁定。在许多 ARM 架构的实现中,IRQ 和 FIQ 中断请求对应于 IRQ 和 FIQ 异步异常。
GIC 安全支持对于实现了安全扩展的处理器:
组 0 中断为安全中断、组 1 中断为非安全中断。
处理器对 GIC 寄存器的访问分为安全与非安全。
非安全访问只能读写控制非安全中断的寄存器。
安全访问可以读写任意寄存器。
安全系统软件单独将每个已实施的中断定义为安全和非安全。GIC 虚拟化支持支持对于虚拟中断的处理,降低 Hypervisor 路由中断到虚拟机的开销。术语介绍中断状态
Inactive: 中断是未触发或者不在等待被处理。
Pending ...
ZCU102提升-PL 协同 PS
写在开头本文正式对 ZynqMP Ultrascale+ 的重点特性—— PL 协同 PS 共同工作进行了初步探索。具体为在 PL 段烧写两个 GPIO 控制器来控制 LED 灯和五个按钮,并编写 PS段程序实现按钮通过中断来控制 LED 灯。
探索过程极其曲折,以至于笔者不得不用一张图来表达现在的心情:
Vivado准备工作
工作环境 vivado 2024.1, ubuntu 22.04.3。
创建 vivado 工程,例如叫做 ZCU102-PSPL-LED。
和 Helloworld 一样在 Block Design 对 ZynqMP 芯片初步配置。
GPIO配置
点击 + 号新增两个 GPIO
GPIO全拼叫General Purpose Input Output(通用输入输出)简称IO口也叫总线扩展器,这里我们加入的 GPIO 将可以让 PL段的 LED灯、按钮得以通过 GPIO 连接到 AXI 进而和 PS 进行交互。
GPIO 0 配置 LED 输出
Xilinx 提供的 AXI GPIO IP 核有两条通道,因此其实可以使用一个 GPI ...