- 博客(58)
- 收藏
- 关注
原创 性能杀手snprintf
在嵌入式软件开发中,标准库中的sprintf和snprintf函数,对于格式转换十分方便,其将格式化的数据写入到指定的字符串缓冲区中。
2024-12-30 16:09:03
404
原创 OpenSBI启动流程分析二
之前OpenSBI完成汇编阶段的启动,接下来会执行sbi_init函数,初始化当前HART的OpenSBI库,并跳转到下一级启动镜像。
2024-11-05 10:11:20
446
原创 OpenSBI的HSM
HSM是指硬件线程状态管理(Hart State Management),其引入了一组Hart状态和一些函数,这些函数允许S模式软件请求改变Hart状态。
2024-09-20 12:44:55
1056
原创 OpenSBI的Domain支持
OpenSBI域(Domain)是将底层硬件划分为系统级的分区,每个分区拥有自己的内存区域(RAM和MMIO设备)和HARTs(硬件线程)。OpenSBI将利用RISC-V架构的特性(如PMP、ePMP、IOPMP、SiFive Shield等)来实现域之间的安全隔离.。
2024-09-04 12:22:32
1069
原创 OpenSBI的PMP
在RISC-V体系架构中,PMP是用于保护物理内存访问权限的机制。PMP机制允许为不同的物理内存区域指定访问权限(读、写、执行)。这种机制使得运行在RISC-V处理器上的软件只能访问被明确授权的物理地址空间,从而提高了系统的安全性和稳定性。SMEPMP机制是一个增强型的PMP扩展,是为了防止M模式内存访问和执行的PMP增强。因为对于一段内存,PMP机制无法实现只有U/S模式访问,而M模式无法访问的情况,SMEPMP机制就是为了解决这一点。
2024-08-23 12:58:28
971
1
原创 LZ4算法使用
LZ4 是无损压缩算法,提供每个核 大于 500 MB/s 的压缩速度,可通过多核 CPU 进行扩展。LZ4算法解压速度极快,单核解压速度达到GB/s,通常达到多核系统的 RAM 速度极限。lz4算法的实现在lib下,lz4.c实现最基本的块格式压缩和解压,lz4hc.c实现块高压缩率的块格式压缩和解压,lz4frame.c实现帧格式压缩和解压,为了方便lz4file.c实现文件压缩解压操作,xxhash.c是LZ4采用的哈希算法。
2024-07-01 10:10:13
1107
原创 压缩算法LZ4
LZ4 是无损压缩算法,提供每个核 大于 500 MB/s 的压缩速度,可通过多核 CPU 进行扩展。LZ4算法解压速度极快,单核解压速度达到GB/s,通常达到多核系统的 RAM 速度限制。
2024-07-01 10:08:31
2788
原创 可信启动Trusted Board Boot
Trusted Board Boot(TBB)对所有固件镜像(包括普通世界的bootloader)进行身份验证,以防止恶意固件在平台上运行。TBB使用公钥加密标准 (PKCS)来建立信任链(Chain of Trust)。
2024-06-21 19:18:48
1423
原创 C语言中的#和##操作符用法
#和##是预处理器(preprocessor)的操作符,主要用于宏(macro)的定义中。这两个操作符提供了字符串化和字符串连接的功能。
2024-06-06 12:26:50
638
原创 RISC-V压缩指令扩展测试
RISC-V定义了压缩指令扩展(compressed instruction-set extension ),命名为“C”扩展。压缩指令使用16位宽指令替换32位宽指令,从而减少代码量。这个C扩展可运用在RV32、RV64和RV128指令集上,通常使用“RVC”来表示支持该扩展指令集。一个程序通常有50%的指令可以使用RVC指令替代,可以减少25%~30%的代码量。
2024-05-24 11:14:29
1994
5
原创 哈希算法SHA256
单向散列函数,常称为哈希函数,为消息产生一个“指纹”,用来检测消息的完整性。常见的哈希算法有MD5、SHA2家族(SHA256/SHA384/SHA512)和SM3等。
2024-05-20 19:08:58
1051
原创 使用自动矢量化编译Neon
本文介绍了如何使用中的自动矢量化功能自动生成包含指令的代码。它包含许多 Neon 代码生成的示例,并强调了如何让编译器生成最佳的性能。
2024-05-13 11:28:17
970
原创 [周问周答]bss段是否占目标文件空间
程序一般由代码段(text)、数据段(data)和未初始化的数据段(bss)等组成。静态变量如果已初始化为非0,其放在data段,占用可执行文件大小;如果未初始化或者初始化为0,其放在bss段,数据本身不占用可执行文件大小,只是为该段预留了空间,也就是,bss段只保存了这些变量的总大小值。
2024-04-29 10:36:50
511
1
原创 使用Neon intrinsics优化C代码
本文介绍了如何在 C 或 C++ 代码中使用 Neon intrinsics,以利用 Armv8 架构中的 Advanced SIMD 技术。另外,也提供了一些使用 Neon 的示例,并介绍了他们的用途。
2024-03-19 18:48:29
1332
原创 Nuclei SDK启动流程分析
以nuclei-sdk-0.5.0版本进行说明,编译SoC和开发板分别选择默认的evalsoc和nuclei_fpga_eval,启动的汇编代码参见startup_evalsoc.S。
2024-03-01 18:55:30
1575
6
原创 Nuclei SDK快速入门指南
*Nuclei Software Development Kit (SDK)**是芯来推出的开源软件平台,用来加速基于芯来处理器的开发。
2024-02-28 18:45:26
993
原创 Neon简介
本文介绍了 Arm Neon 技术,一种⾼级 SIMD(Single Instruction Multiple Data,一条指令操作多个数据)架构扩展,Armv8‑A 和 Armv8-R 架构支持了 Neon 技术扩展。Neon 技术是指令集架构的专用扩展,其提供了额外的指令,用于对多个数据流进行并行计算。通过加速音频和视频编解码、用户接口、2D/3D 图形或游戏,SIMD架构可以改善多媒体用户体验。
2024-02-22 12:58:07
1672
原创 (12)ATF BL31中断
系统在运行过程中的任何阶段,都有可能产生中断。在Armv8架构系统中,TEE-OS运行在安全世界的EL1,Rich-OS运行在非安全世界的EL1,而BL31则运行于EL3。想实现各种中断在三种状态下被处理的统一性和正确性,就需要确保各种状态下中断向量表以及GIC的正确配置。在ATF的BL31阶段启用了中断,BL31主要完成了GIC驱动初始化,中断注册,中断处理,中断路由配置等功能。
2024-02-22 12:53:08
1472
2
原创 Arm通用中断控制器GICv3和GICv4
本文介绍了 Arm 通用中断控制器(GIC)v3和v4的功能,描述了 GICv3 中断控制器的相关操作,同时也介绍了如何在裸机环境中配置GICv3 中断控制器。
2023-12-28 19:23:29
2887
原创 (10)ATF MMU转换表
MMU(内存管理单元)负责将软件使用的虚拟地址转换为内存系统中使用的物理地址。MMU包括两个模块:TLB(Translation Lookaside Buffer)和TWU(Table Walk Unit)。TLB缓存最近使用的转换(类似cache,将转换映射放入缓存,提高映射效率),而TWU从内存中读取转换表(查表,完成虚拟地址到物理地址的转换)。转换表位于内存中,用于存储虚拟地址和物理地址之间的映射,另外还包括物理内存位置的属性。这些转换表是由内存管理单元MMU访问。
2023-11-24 14:11:12
1628
原创 AArch64 TrustZone
TrustZone 是 Arm A 系列中安全架构的名称。TrustZone 首次在 Armv6K 中引入,Armv7-A 和 Armv8-A 也是支持的。TrustZone 提供两种执行环境,它们之间是硬件强制隔离的,如下图所示。普通世界运行着丰富的软件。这些软件栈通常包括许多应用程序,操作系统如Linux,可能还有 hypervisor,它们通常庞大且复杂。虽然可以尽力保护它们,但由于攻击面太大,它们也更容易受到攻击。可信世界运行着一套小而简单的软件,通常称为可信执行环境(TEE)。
2023-10-19 12:06:15
534
原创 ARM安全简介
对于一些注重安全性的应用程序,Arm提供了安全计算平台。本文介绍了一些与安全相关的概念,只是一篇入门指南,为后续介绍其他安全相关技术奠定了基础。本文仅作概述性介绍,如果您想了解更多信息,可以参考此主题的其他书籍和指南。
2023-09-29 12:30:00
245
原创 Linux与BL31之间添加SMC实现随机数获取
Armv8架构中有四个异常等级EL0-EL3,两种安全状态即安全和非安全状态。SVC指令用于EL0下的用户应用程序请求EL1下的操作系统的服务,SMC指令允许普通世界中的程序请求EL3下的安全监控器的服务,这些都是同步异常指令,旨在不同异常等级下进行切换。本文中随机数应用在EL0下运行,处于非安全状态;Linux Kernel在EL1下运行,处于非安全状态;真随机数生成器服务在EL3下运行,处于安全状态。
2023-09-20 09:58:32
861
1
原创 了解Armv8.x和Armv9.x扩展
Arm架构新增的功能以扩展的形式提供,这样Arm能够定期发布新功能,以响应合作伙伴的需求,而无需对主架构进行重大更改。
2023-09-08 11:08:27
1219
原创 AArch64内存管理
内存管理描述了如何控制对系统内存的访问。每次操作系统或应用程序访问内存时,硬件都会执行内存管理。内存管理是一种向应用程序动态分配内存区域的方法。
2023-09-07 10:13:30
1136
原创 AArch64内存模型
内存属性/特性是定义内存行为的方式。其提供了一个结构和一组规则,当配置如何访问和使用内存地址时,你需要遵守这些规则。内存属性/特性用于一个地址,并定义了与内存访问相关的规则。考虑一个简单的系统,地址空间如下。地址空间中内存区域的排列称为地址映射。内存和外设内存,代码和数据操作系统资源和用户应用程序资源处理器与外设交互的方式和与内存不同。例如,你通常想缓存内存,但是却不想缓存外设。缓存是将内存中的信息拷贝存储到一个硬件区域(称为缓存)。缓存距离内核更近,内核访问速度更快。
2023-08-29 09:49:58
801
原创 AArch64异常模型
AArch64 异常模型指南介绍了 Armv8‑A 和 Armv9‑A 中的异常和特权模型。它涵盖了 Arm 架构中不同类型的异常,以及与异常相关的处理器行为。
2023-07-27 12:33:15
690
原创 ARM架构介绍
当提及术语架构时,我们指的是功能规范。但就 Arm 架构而言,指的是处理器的功能规范。架构指定处理器的行为方式,例如它有哪些指令以及这些指令的作用。你可以认为架构是硬件和软件之间的契约。该架构描述了软件可以依赖硬件来提供哪些功能。正如我们在架构和微架构中解释的那样,某些功能是可选的。项目描述指令集每条指令的功能;指令在内存在内存中如何表示(编码)寄存器组有多少个寄存器;寄存器的大小;寄存器的功能;初始状态异常模型不同级别的特权;异常的类型;发生异常或者从异常返回会发生什么内存模型。
2023-07-13 12:43:13
5748
原创 (08)ATF工具
固件镜像包FIP(Firmware Image Package)是用于将启动的所有镜像打包到一个文件中,以便于启动从存储介质中加载。TF-A中定义的存储抽象层可以从FIP中加载镜像,而FIP是从存储介质中加载。FIP布局由目录表(ToC)和负载数据组成。ToC Header是头部标记信息;ToC Entry是每个镜像的入口信息,Data就是对应的镜像负载数据;ToC End Marker是结束标记。
2023-07-05 11:18:17
891
原创 (07)ATF安全启动
安全启动的目的是保证系统从上电运行开始,到最终的操作系统加载启动完成,所有的固件均经过完整性和真实性验证,保证系统的可信性。
2023-07-05 11:14:35
972
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人