
ARM系统
文章平均质量分 75
神一样的老师
这个作者很懒,什么都没留下…
展开
-
《Neon程序员指南》文档中关于矩阵转置的两处笔误
图6-11中,左边的指令应该是trn1 v1.4s, v0.,4s, v3.4s。图6-15中trn1的图中有两个箭头画错了。今天在看《Neon程序员指南》()发现两处笔误,随手记在这里。原创 2024-09-09 09:19:18 · 270 阅读 · 0 评论 -
QEMU用户模式测试AARCH64程序
QEMU(快速模拟器)是一个开源的机器模拟器和虚拟化器,它能够模拟多种处理器架构,并且可以在不同平台上运行。QEMU 支持两种模式:用户模式和系统模式。要启动 QEMU 并使用用户模式或系统模式,你需要使用不同的命令行参数。例如:用户模式:qemu- -cpu -L 系统模式:qemu-system- -m -hda原创 2024-09-07 11:17:07 · 1598 阅读 · 0 评论 -
在Ubuntu下安装QEMU 9.1 AARCH64环境
最近在写一本关于ARM64的书,所以想用QEMU模拟AARCH64环境并测试一下相关代码,在此记录下整个过程。原创 2024-09-07 10:21:05 · 1770 阅读 · 0 评论 -
ARM64的汇编资源
前面的比较通俗,后面的就相当艰深了,特别是关于内存处理的那部分。Perry Kivolowitz的电子书,适合有C语言基础的学习,作者主要是通过C语言和汇编的对比来讲解指令。内容不多,但很实用。最近在写一本ARM64的教材,所以在晚上查找了一下相关资源,都是免费开源的,不包括盗版书籍。这是一本针对ARM32的书,2018年写的,内容全面,可操作性强。有关ARM64仿真器的资源没有列在这里,感兴趣的可以看我以前发的博客。一个退休教授写的书, 其实是学习计算机组成的好的教材。各位朋友有资源推荐的,欢迎留言。原创 2024-08-17 06:55:47 · 661 阅读 · 0 评论 -
引擎盖下:系统调用
简短的答案是,系统调用是一种由操作系统自身在其自己的私有内存区域中处理的类似函数调用,并可以访问内部特性和数据结构。我们的程序在“用户空间”中运行。在ARM64处理器上,用户空间的技术名称是EL0(异常级别0)。我们只能通过精心控制的机制——如系统调用——在内核空间中操作。内核(或系统)通常操作的地方的技术名称称为EL1。还有两个更高的异常级别(EL2和EL3),这些超出了本书的范围。原创 2024-08-16 08:24:03 · 927 阅读 · 0 评论 -
在 AArch64 架构中对立即数进行编码的方法
AArch64 是一个具有 32 位固定指令宽度的指令集架构(ISA),这意味着在单个指令中没有足够的空间来存储一个 64 位的立即数。与作者之前熟悉的 x86 架构相比,在 x86-64 上处理立即数要简单一些,因为 x86 指令可以有可变宽度。像 ARM 这样的固定宽度指令集必须以不同的方式处理立即数。将相同的值赋给寄存器x0。原创 2024-08-14 07:13:34 · 1189 阅读 · 0 评论 -
AArch64中的寄存器
大多数A64指令在寄存器上操作。该架构提供了31个通用寄存器。每个寄存器可以作为64位的X寄存器(X0..X30)使用,或者作为32位的W寄存器(W0..W30)使用。这两种是查看同一个寄存器的两种不同方式。例如,这个寄存器图示显示了W0是X0的低32位,W1是X1的低32位:图6-1:寄存器图示对于数据处理指令,选择X或W决定了操作的大小。使用X寄存器将得到64位的计算结果,使用W寄存器将得到32位的计算结果。当写入W寄存器时,如上例所示,64位寄存器的高32位将被清零。原创 2024-08-12 06:05:37 · 563 阅读 · 0 评论 -
从cpu_features源码看如何获得CPU信息
上一篇博文,提到可以用/proc/cpuinfo文件信息获得CPU的相关参数。在Linux下,cpu_features也是用 /proc/cpuinfo文件获得信息的,只是它对文件进行了解析处理。在Windows下,它是通过调用Windows API GetNativeSystemInfo来获得相关信息的。为什么cpu_features不直接用汇编获得相关信息呢?因为相关寄存器在用户态是无法访问的,需要在内核里面才能访问。不过cpu_features在FreeBSD中确实调用了汇编获得CPUID。原创 2024-08-09 07:12:34 · 325 阅读 · 0 评论 -
使用/proc/cpuinfo进行运行时CPU特性检测
一些标志可能是特定于ARM架构的,而其他一些可能是通用的或特定于其他CPU架构的。另外,不同的内核版本返回的标志也可能不同,比如ARMv8-A 64位内核使用 'asimd' 来支持高级SIMD,而ARMv7-A 32位内核使用 'neon'。因此,在ARMv8-A 64位内核上,查找 /proc/cpuinfo 中 "neon" 字符串的NEON检测代码将不起作用。文件在Linux系统中提供了关于CPU的详细信息,包括一系列的标志(flags),这些标志描述了CPU支持的特性和指令集扩展。原创 2024-08-09 07:11:32 · 2148 阅读 · 0 评论 -
在ARM程序中启用自动向量化
NEON是作为一种附加的加载/存储架构设计的,它为C/C++等语言提供了良好的向量化编译器支持。这使得并行性水平很高。你可以为需要极高性能的应用手动编写NEON指令。它包括低成本的数据大小提升和降级。它还包括结构加载,能够访问在内存中交错的多个数据流。NEON指令可以作为常规ARM代码的一部分编写。这使得NEON编程比使用外部硬件加速器更简单、更有效。有NEON指令可用于读写外部内存,将数据在NEON寄存器和其他ARM寄存器之间移动,以及执行SIMD操作。原创 2024-08-08 10:46:04 · 705 阅读 · 0 评论 -
使用NEON内联函数进行编程
直接用汇编语言编写最优的NEON代码,或使用内联函数接口,需要对使用的数据类型以及可用的NEON指令有深入的理解。要知道使用哪些NEON操作,看看如何将算法分解为并行操作是有用的。例如,加法、最小值和最大值等可交换操作从SIMD的角度来看特别容易。这些内联函数指示编译器引用输入Q寄存器中的上D寄存器或下D寄存器。因此,这些操作不会转换为实际代码,但它们影响用于存储vec64a和vec64b的寄存器。上述代码显示,可以使用一个包含四个32位值的向量作为累加器和临时寄存器。这假设数组元素的总和适合32位通道。原创 2024-08-08 10:46:15 · 227 阅读 · 0 评论