在阅读了以下论文后,https://people.freebsd.org/~lstewart/articles/cpumemory.pdf("每个程序员应该了解内存的内容")我想尝试一下作者的测试,即测量效果TLB的最终执行时间.
我正在研究嵌入Cortex-A9的三星Galaxy S3.
根据文件:
我们在L1中有两个用于指令和数据缓存的微TLB(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388e/Chddiifa.html)
主要TLB位于L2(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0388e/Chddiifa.html)
Data micro TLB有32个条目(指令微TLB有32或64个条目)
我写了一个小程序,用N个条目分配一个结构数组.每个条目的大小为== 32个字节,因此它适合缓存行.我执行几次读取访问,并测量执行时间.
typedef struct {
     int elmt; // sizeof(int) == 4 bytes
     char padding[28]; // 4 + 28 = 32B == cache line size
}entry;
volatile entry ** entries = NULL;
//Allocate memory and init to 0
entries = calloc(NB_ENTRIES, sizeof(entry *));
if(entries == NULL) perror("calloc failed"); exit(1);
for(i = 0; i < NB_ENTRIES; i++)
{
      entries[i] = mmap(NULL, …在过去的3-4天里,我一直在用这个来敲打我的脑袋,我找不到DECENT解释性文件(来自ARM或非官方的)来帮助我.我有一块ODROID-XU板(big.LITTLE 2 x Cortex-A15 + 2 x Cortex-A7)板,我正在尝试更多地了解ARM架构.在我的"试验"代码中,我现在已经到了我想从其WFI(等待中断)状态唤醒其他核心的阶段.
我仍然试图找到的缺失信息是:
1.获取内存映射GIC的基地址时,我明白我需要读取CBAR; 但没有任何文档解释如何安排CBAR中的位(2个PERIPHBASE值)来获取最终的GIC基址
2.通过GICD_SGIR寄存器发送SGI时,我应该选择0到15之间的中断ID?有关系吗?
3.通过GICD_SGIR寄存器发送SGI时,如何告知其他内核何处开始执行?
4. U-BOOT引导加载程序加载我的代码的事实如何影响这个上下文?
该的Cortex-A系列程序员指南3.0版(这里找到:链接)规定在以下部分22.5.2(在Linux中SMP开机,页271):
当主核心启动时,辅助核心将使用WFI指令保持待机状态.它(主核心)将为辅助核心提供启动地址,并使用处理器间中断(IPI)唤醒它们,这意味着通过GIC发信号通知SGI
Linux如何做到这一点?文档-S没有提供有关" 它将为辅助核心提供启动地址 "的任何其他详细信息.
我的挫折感越来越大,我会非常感谢你的答案.非常感谢你提前!
额外细节
我使用的文档:
我现在做了什么:
以上所有似乎都能正常工作.
我现在要做的是:
.... UPDATE ....
我已经开始查看Linux内核和QEMU源代码以寻找答案.这是我发现的(如果我错了,请纠正我):
我是一个从微控制器编程开始的新手.这里感兴趣的芯片是cortex-a9.在复位或上电时,我的读数必须是0x0000000处的代码.虽然我的问题可能听起来太微不足道,但这些问题将有助于我提出一些概念.
内存地址0x0000000是否驻留在ROM中?从该地址读取代码后会发生什么?是否应该存在某种类型的引导加载程序,如果存在,那么它应该在哪个地址?它是否也应该驻留在ROM中?最后,内核在什么时候启动?内核代码驻留在哪里?
读取 ARM arch 时。参考 手册 v7,我发现了两个概念;一致性点 (PoC) 和统一点 (PoU)。
对于 PoC,看起来所有代理(即 CPU 内核)都可以看到相同的内存副本。
对于 PoU,看起来所有代理(在本例中为 CPU 内核和 MMU)都可以看到相同的内存副本。
我有几个后续问题:
我的理解正确吗?
如果是这样,如果我发出 DCCMVAC(数据缓存清理 MVA 到 PoC)并将 MVA 赋予 0x40000000,(假设 PoC 恰好是 0x70000000),
VA 0x40000000 和 0x70000000 之间的所有缓存条目都被清除了吗?
那么,如果我发出带有 MVA 0x0 的 DCCMVAC,是否会清除所有数据缓存条目?
PoU 听起来像是 MMU 本身有自己的数据缓存(不是 TLB),用于在主内存中进行页表遍历。这样对吗?
我做了一些研究,但找不到太多信息.
我想知道ARM嵌入式处理器有多少L1读取和L1写入端口以及端口有多宽.具体来说,我对Cortex-A8,Cortex-A9和Cortext-A15感兴趣.
我的盲目猜测是Cortex-A9处理器有一个L1读端口和一个L1写端口,宽64位.我的另一个猜测是它有一个共享的读/写端口.有什么想法吗?
当我在Cortex-A9 MPCore中调试MMU时,总是看到域访问控制寄存器,但是域的含义是什么?最多16个域?有人可以给我一个链接来解释吗?
我的图像处理项目适用于灰度图像.我有ARM Cortex-A8处理器平台.我想利用NEON.
我有一个灰度图像(考虑下面的例子),在我的alogorithm中,我只需要添加列.
我怎样才能加载4个8位的像素值在并行,这是uint8_t,如4个uint32_t的到128位NEON寄存器中的一个?我必须使用什么内在的东西?
我的意思是:

我必须将它们加载为32位,因为如果你仔细观察,我做255 + 255的那一刻是512,它不能保存在8位寄存器中.
例如
255 255 255 255 ......... (640 pixels)
255 255 255 255
255 255 255 255
255 255 255 255
.
.
.
.
.
(480 pixels) 
大家好,我有一个我为ARM Cortex-A8处理器编译的项目.我正在利用GCC来做到这一点.目前我的可执行文件的大小是220.1 KB.现在我修改我的makefile并添加标志-mthumb,makefile行看起来有点像这样 -
gcc -mcpu=cortex-a8 -mthumb -marm -mfloat-abi=softfp -mfpu=neon
我在所有的makefile中做了这个更改,我构建了我的项目,但我最终得到的可执行文件仍然是220.1 KB.
我对命令行进行了一次更改,我添加了-mthumb-interwork选项
gcc -mcpu=cortex-a8 -mthumb -mthumb-interwork -marm -mfloat-abi=softfp -mfpu=neon
我再次获得相同大小的可执行文件220.1 KB.这样做我错过了什么吗?
我写了一个小程序,找到两个数字中最小的一个,然后使用以下命令行编译它
gcc main.c -o main
我得到一个8.5 KB的可执行文件
接下来,我做了
gcc -mthumb main.c -o main
我仍然得到一个8.5 KB的可执行文件.
这里有什么不对?
我做了一个cat /proc/cpuinfo看看我的处理器是否真的支持拇指,我发现它确实支持.我明白了 - 
Processor: ARMv7 Processor rev 5 (v7l)
Features: swp half thumb fastmult vfp edsp neon vfpv3
....
....
我对 yocto 项目中的“只读 rootfs”功能有一些疑问,不幸的是,文档并没有那么有用。
因此,将其添加到 EXTRA_IMAGE_FEATURES 会使 yocto fs 只读,但在:
5.15.3. Areas With Write Access
With the read-only-rootfs feature enabled, any attempt by the target to
write to the root filesystem at runtime fails. Consequently, you must make
sure that you configure processes and applications that attempt these types
of writes do so to directories with write access (e.g. /tmp or /var/run).
他们说某些区域可以成为 rw,但他们没有提供有关这方面的额外信息。
我想要实现的是所有要加载到 RAM 中的操作、进程和内容,而 SD 卡应该保持不变,就像在烧毁之后一样,而不是在上面写一个位。但是用户应该有可能在需要时打开 sd 卡 rw 上的特定文件夹(内存区域)并写入一些内容,然后再次将系统转为只读。
有人有机会这样做吗?你会帮我很多。
我想读取一些Cortex-A53寄存器的值,例如
不幸的是,我缺乏一点嵌入式/组装经验。文档显示
访问 ID_AA64ISAR0_EL1: MRS 、 ID_AA64ISAR0_EL1 ;将ID_AA64ISAR0_EL1读入Xt ID_AA64ISAR0_EL1[31:0]可以通过内部存储器映射接口和外部调试接口访问,偏移量0xD30。
我决定在我的目标上使用 devmem2(因为 busybox 不包含 devmem 小程序)。以下读取寄存器的过程是否正确?
devmem2 0xD30
我不确定的部分是使用“偏移量”作为直接物理地址。如果它是实际地址,为什么要调用“offset”而不是“address”。如果是偏移量,基地址是多少?我 99% 确定这不是正确的过程,但我如何知道要添加偏移量的基地址?我搜索了Armv8技术参考手册和A53 MPCore文档没有结果。详细解释了寄存器内容,但似乎假设您使用标签 ID_AA64ISAR0_EL1 从 ASM 读取它们。
更新:
我找到了这个:
配置基地址寄存器,EL1 CBAR_EL1 的特性包括: 用途 保存内存映射 GIC CPU 接口寄存器的物理基地址。
但它只是重复了我的问题,如何读取另一个寄存器?
更新 2: 第一个更新似乎仅与 GIC 相关,与我试图读取的配置寄存器无关(我认为我误解了信息)。
对于手头的具体问题(检查加密扩展可用性),人们可以简单地 cat /proc/cpuinfo 并查找 aes/sha 等。
更新3:
我现在正在调查http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0176c/ar01s04s01.html,以及 SoC 特定的基地址,因此可以在SoC 的参考手册。
更新4:
感谢这个很好的答案,我似乎能够通过我的内核模块读取数据:
[ 4943.461948] ID_AA64ISA_EL1 : 0x11120
[ 4943.465775] ID_ISAR5_EL1     : 0x11121
PS: 这篇文章非常有见地,再次感谢!
更新5: 根据要求源代码:
/******************************************************************************
 *
 *   Copyright …cortex-a ×10
arm ×8
amba ×1
armv8 ×1
base-address ×1
benchmarking ×1
c ×1
compilation ×1
cpu-cache ×1
cpu-cores ×1
embedded ×1
filesystems ×1
intrinsics ×1
linux ×1
mmu ×1
neon ×1
thumb ×1
wakeup ×1
yocto ×1