Carlos Wei (Haochen)

Results 121 issues of Carlos Wei (Haochen)

# 1. Memory 如果在ARM上启动安全扩展的功能,4GB的内存被划分为安全和非安全两个区域。安全区域还会再次被细分(NSC和S)。 ![](https://raw.githubusercontent.com/carloscn/images/main/typora202311161720647.png) ## 1.1 Secure (S) ARM TrustZone 技术创建了一个安全的执行环境,使得特定的内存区域和外设只能被**安全软件**或**安全主体**访问。这里的“安全地址”指的是那些被指定为只能由安全状态下的软件访问的内存地址或外设地址。“安全事务”则指的是由安全主体(例如处理器的安全模式)发起并针对安全地址的操作。 **例如:** * **安全内存区域访问**:假设有一个内存区域被配置为安全区域,用于存储敏感数据,如加密密钥或用户个人数据。只有在处理器运行在安全模式(TrustZone的安全状态)时,这些数据才能被访问。如果非安全状态下的代码尝试访问这些安全地址,访问将会被阻止或引发安全异常。 * **安全外设访问**:这个安全外设被映射到安全的地址空间内。在某些系统中,特定的外设(如加密处理单元或安全存储设备)可能被配置为只能在安全模式下访问。只有安全软件(例如运行在TrustZone安全环境中的软件)可以与这些外设交互,执行如数据加密、解密或安全认证的操作。 * **Secure Boot过程**:在设备启动时,引导加载程序可能首先运行在安全模式下,以确保系统的完整性。在这个过程中,它可能会访问存储在安全内存区域的引导代码和配置数据,确保只有验证通过的软件才能被加载和执行。 * **安全事务请求处理**:当安全应用程序(例如运行在TrustZone安全环境中的移动支付应用)需要执行事务时,它可能会发起对安全内存或外设的访问请求。这些请求被视为安全事务,因为它们由安全主体发起并且针对的是安全地址。 ## 1.2 Non-Secure Callable (NSC) 在ARMv8-M架构中,NSC(Non-secure Callable)是一种特殊类型的安全内存区域。这种设计主要是为了在保持系统安全性的同时,提供一种从非安全状态(Non-secure state)到安全状态(Secure...

ARMv8
Cortex-M

# 1. 构建Android系统 ## 1.1 源代码下载 因为国外地址可能访问不了或者访问速度慢,我们需要添加国内数据源: ``` sudo gedit /etc/apt/sources.list ``` 把清华源复制到源列表,之前的源不要动 ``` deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/...

Embedded
Android

在 [[LS104x] 使用ostree更新rootfs](https://github.com/carloscn/blog/issues/194#top) 中我们在ramdisk中使用ostree的checkout功能还原出一个完整版本rootfs,但是这个方法并没有完全彻底的使用ostree的部署功能。本节将要总结和整理一个ostree的部署功能。类似于该demo:[YOUTUBE - Designing OSTree based embedded Linux systems with the Yocto Project](https://www.youtube.com/watch?v=3i48NbAS2jUube) 从ubuntu更新为busybox,更新原理如图所示: ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309270931825.png) Note,这些ostree的部署的逻辑被包含在了meta-updater里面, https://github.com/advancedtelematic/meta-updater/tree/master 。但metaupdater集成度很高,而且该仓库已经很久没有更新了,就导致和新版的yocto集成有很多问题,需要不少的工作量。因此,本文手动部署ostree,并且参考meta-updater里面的逻辑手动补充一些脚本来完成ostree的部署和ostree部署的rootfs的使用。 # 1. 服务器端配置 本文使用HTTP而不是HTTPS,并且服务器使用本机HOST局域网更新。 ## 1.1 仓库配置 - 需要进行ostree仓库的初始化 -...

ARMv8
Linux
Embedded
LinuxKernel
NXP

我们可以使用ostree来更新rootfs系统。以下demo基于ls1046a进行ostree更新rootfs展示: 以下板子的相关信息: * 原版rootfs:ubuntu 18.04 * 新版rootfs: busybox 该部分仅仅是为了做demo演示,不作为任何工程设计。 * ostree在ubuntu中会从服务更新仓库; * ubuntu重启之后,initramfs检测到有更新,切换更新的busybox的rootfs; * initramfs切换到新的busybox的rootfs启动; 这里为了演示initramfs简化了逻辑,即发现是ubuntu则切换新的busybox系统,发现是busybox就切换到ubuntu上面。(系统只能在ubuntu中拉取更新) 目标,从ubuntu更新为busybox。更新原理如图所示: ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309221206739.png) # 1. 服务器端配置 本文使用HTTP而不是HTTPS,并且服务器使用本机HOST局域网更新。 ## 1.1 仓库配置 仓库配置中包含: * 需要进行ostree仓库的初始化 * 需要在ostree仓库中增加busybox的rootfs文件...

ARMv8
Linux
Embedded
LinuxKernel
NXP

ostree工具是一个依赖其他库非常多的工具,我们可以借助一些工具来帮助自己完成ostree的移植。例如buildroot就是一个非常好的工具。在LS104x中的`flexbuild`工具已经集成了buildroot,可以使用buildroot来完成ostree。 关于flexbuilder的使用,可以参考:https://docs.nxp.com/bundle/GUID-C241BB12-95F6-4D6B-A205-7EFD35551DE2/page/GUID-47B8F1F5-3A8F-45F4-A096-4D3DCDE8D07C.html # 1. 编译带有ostree的ramdisk 建议使用原生的bash来运行这些脚本。 ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211649242.png) ## 1.1 buildroot的配置 先对buildroot进行配置: `flex-builder -i mkrfs -r buildroot:imaevm:custom -a arm64` 之后会弹出界面: ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211650898.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typoratypora202309211651830.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651672.png) 还需要配置网络库: ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651235.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651859.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651352.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651613.png) ![](https://raw.githubusercontent.com/carloscn/images/main/typora202309211651374.png) ## 1.2...

ARMv8
Linux
Embedded
LinuxKernel
NXP

在NXP的官方手册中,并没有给出如何使用initramfs。本文基于NXP的LS1046a的平台,对kernel、设备树以及initramfs进行FIT格式的打包,接着介绍如何启动initramfs以及如何从initramfs切换到真正的rootfs。LS1046a的分区已经FIT image的格式如下: ## 1. initramfs制作 ### 1.1 导出initramfs 我们需要准备正确的initramfs的系统。通常initramfs系统有一些对于硬件的初始化的操作,所以对于不同嵌入式的平台,initramfs是不能够通用的。我们需要使用芯片原厂提供的initramfs。在NXP的bsp包中并没有给出initramfs的源文件,我们需要借助yocto工程中导出initramfs。 可以按照我下面的配置,也可以在initramfs的官方文档中使用他们的配置: ```bash IMAGE_FSTYPES += "ext4 ext4.gz " INITRAMFS_IMAGE = "core-image-base" INITRAMFS_IMAGE_BUNDLE = "1" IMAGE_FSTYPES = "ext4.gz" ``` initramfs的配置可以参考官方文档:[https://docs.yoctoproject.org/ref-manual/variables.html#term-INITRAMFS\_IMAGE](https://docs.yoctoproject.org/ref-manual/variables.html#term-INITRAMFS\_IMAGE) * 如果你写的是`core-image-base`使用`bitbake core-image-base` ...

ARMv8
Linux
Embedded
LinuxKernel
NXP

--- description: Compiling a user uboot command --- # \[IMX6] Defining A U-Boot Command ## 1. Function Overview I wish to boot a partition that can be decided in the...

Linux
Embedded
ARMv7

# 1. Overview 中断是一个典型的组件在一般的微控制器中。中断时间通常由硬件产生,例如外设和外部的引脚。中断会改变程序的执行路径。当一个中断产生的时候,通常会发生: 1. 外设assert中断请求到处理器; 2. 处理器会暂停当前的任务; 3. 处理器跳转到当前中断的服务程序中ISR; 4. 处理器恢复中断之前的任务。 在Cortex-M处理器中提供了一个Nested Vectored Interrupt Controller(NVIC)。除了中断,还有其他事件需要服务,我们称之为“异常”。在ARM的术语中,中断属于异常的一种,而在工程使用中有个比较习惯的表述,中断更侧重于由外设,外围器件这种角色产生的;而异常是由处理器本身产生的。无论是外设的中断还是处理器异常,在ARM中都通过异常处理机制来对这种信号进行管理。在典型的Cortex-M控制器中,NVIC接收各种各样的中断源: 有外设、有IO口、有处理器产生的异常、有定时器。在ARMv8里面和NVIC同等位置的IP是GIC,[12_ARMv8_异常处理(三)- GICv1/v2中断处理](https://github.com/carloscn/blog/issues/51)。而NVIC更像是ARMv8架构中的Legacy的中断。[11_ARMv8_异常处理(二)- Legacy 中断处理](https://github.com/carloscn/blog/issues/49)。 Cortex-M3 and Cortex-M4的NVIC支持240IRQs,和Non-Makable Interrupt(NMI),和System Tick定时器中断,还有数个系统异常。注意,NMI是无法屏蔽的中断,像是watchdog或者Brown-Out Detector (BOD)。 为了能够从中断程序中恢复中断现场。ARM处理器需要保存中断之前的状态,在中断结束之后,从保存的区域中恢复。这个功能的实现可以通过硬件,也可以软硬结合。在Cortex-M中,一些寄存器的值会被保存到栈上,等中断结束之后会从栈上恢复状态。 # 2....

Embedded
ARMv7
Cortex-M

# 09_ARMv8_内嵌汇编(内联汇编)Inline assembly 内联汇编并非ARCH64专门的使用方法,而是GNU编译器通用的做法。目的有二,其一,对于时间敏感的函数使用内联汇编减少执行开销;其二,C语言无法访问架构级的特殊指令,比如内存屏障功能。 ## 1. 基本用法 ### 1.1 基础内联汇编格式 Define:`asm ("asm instruction")` 【示例】: `asm(icicalluis)` 调用一条高速缓存维护指令。 ### 1.2 扩展内联汇编代码 * Define:`asm qualifier-asm (AssemblerInstruction)` * Instruction: * 格式:指令部分:输出部分:输入部分:损坏部分 * 编译器不会解析,按照字符串处理 *...

ARMv8

# [Embedded] enabling the cryptsetup on ramdisk _**Linux Unified Key Setup**_ (LUKS) is a specification for block device encryption. It establishes an on-disk format for the data, as well as...

Linux
Embedded
LinuxKernel
ZYNQ