memory-alignment相关内容

内存对齐的目的

诚然,我不明白.假设您有一个长度为 1 字节的内存字的内存.为什么不能在未对齐地址(即不能被 4 整除)的单个内存访问中访问一个 4 字节长的变量,因为对齐地址就是这种情况? 解决方案 这是许多底层处理器的限制.通常可以通过执行 4 次低效的单字节读取而不是一次高效的字读取来解决该问题,但许多语言说明符认为,将它们取缔并强制所有内容对齐会更容易. 此链接中有更多信息,OP发现了. ..
发布时间:2021-11-27 08:02:39 其他开发

为什么 C 中的 double 是 8 个字节对齐的?

我正在阅读一篇关于内存中数据类型对齐的文章(此处)理解一点即 注意双变量将在 32 上的 8 字节边界上分配位机,需要两个内存读取周期.在 64 位机器上,根据银行的数量,双变量将被分配到 8 字节边界,只需要一个内存读取周期. 我的疑问是:为什么需要在 8 字节边界而不是 4 字节上分配双变量?如果它在 4 字节边界上分配,我们仍然只需要 2 个内存读取周期(在 32 位机器上).如 ..
发布时间:2021-11-26 14:40:48 其他开发

为什么 C 中的 double 是 8 个字节对齐的?

我正在阅读一篇关于内存中数据类型对齐的文章(此处)理解一点即 注意双变量将在 32 上的 8 字节边界上分配位机,需要两个内存读取周期.在 64 位机器上,根据银行的数量,双变量将被分配到 8 字节边界,只需要一个内存读取周期. 我的疑问是:为什么需要在 8 字节边界而不是 4 字节上分配双变量?如果它在 4 字节边界上分配,我们仍然只需要 2 个内存读取周期(在 32 位机器上).如 ..
发布时间:2021-11-24 23:28:44 C#

arm64上的Linux:sendto导致“未处理的错误:对齐错误(0x96000021)"当从 mmapped 相干 DMA 缓冲区发送数据时

我正在构建一个基于配备 arm64 CPU 的 UltraScale+ FPGA 的数据采集系统.数据通过 DMA 传输到 RAM.驱动程序中的 DMA 缓冲区保留如下: virt_buf[i] = dma_zalloc_coherent(&pdev->dev, BUF_SIZE, &phys_buf[i],GFP_KERNEL); 在驱动的mmap函数中,映射到用户空间的方式如下: #if ..
发布时间:2021-11-17 22:44:15 服务器开发

在 armv8 架构中将半字值存储到堆栈内存中时出现总线错误?

我有两个寄存器 w1 和 w2,我想将它们存储在堆栈中.我想将完整的单词 w1 和 w2 的一半存储到堆栈中.这是我的实现: STR w1, [sp, #-8]!STRH w2,[sp,#-8]! 在编译时,第一条指令运行良好,但第二条指令引发总线错误.我知道这是一些对齐问题,但我无法正确理解为什么会发生这种情况? 我正在为 ARMv8(64 位)架构编译. 解决方案 根据 AR ..
发布时间:2021-11-17 22:44:12 其他开发

GCC 为 ARM 上的未对齐浮点访问生成程序集

您好,我目前正在开发一个程序,我需要处理一个包含一系列可能未对齐(有时也是)的浮点数的数据 blob.我正在为 ARM cortex-a8 使用 gcc 4.6.2 进行编译.我对生成的汇编代码有疑问: 作为例子,我写了一个最小的例子:对于下面的测试代码 浮动对齐[2];float *unaligned = (float*)(((char*)aligned)+2);int main(int ..
发布时间:2021-11-17 22:27:38 其他开发

为什么这个 EXC_BAD_ACCESS 发生在 long long 而不是 int?

我遇到了一个带有处理数据序列化的代码的 EXC_BAD_ACCESS.该代码仅在设备(iPhone)上失败,而在模拟器上失败.它也仅在某些数据类型上失败. 这是重现问题的测试代码: template void test_alignment() {//分配内存并记录原地址无符号字符 * 原点;unsigned char *tmp = (unsigned char*)malloc(sizeof ..
发布时间:2021-11-17 22:18:32 移动开发

在编写干净的 C 代码时利用 ARM 未对齐的内存访问

过去,ARM 处理器无法正确处理未对齐的内存访问(ARMv5 及更低版本).如果 ptr 未在 4 字节上正确对齐,则类似 u32 var32 = *(u32*)ptr; 只会失败(引发异常). 不过,编写这样的语句对于 x86/x64 会很好,因为这些 CPU 总是非常有效地处理这种情况.但是根据 C 标准,这不是编写它的“正确"方式.u32 显然相当于 4 个字节的结构,必须在 4 个字 ..
发布时间:2021-11-17 22:04:50 其他开发

来自任意解引用指针的输出

我按如下方式填充内存: char buf[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88}; 然后将无符号长指针依次放在前5个字节上并输出结果: char *c_ptr;无符号长 *u_ptr;c_ptr = buf;for (int i=0;i 当我在 x64 平台上执行此代码时,我得到了预期的结果: 443322115544 ..
发布时间:2021-11-17 21:57:08 C/C++开发

如何捕获未对齐的内存访问?

我正在开发一个实现一些流密码算法的宠物开源项目,但我遇到了一个错误,只有当我在 ARM 处理器上运行它时才会触发.我什至尝试过在 qemu 下在 x86 中运行 ARM 二进制文件,但没有在那里触发错误. 该错误的具体机制仍然难以捉摸,但我最好的办法是相信它是由我的程序中进行的未对齐内存访问尝试引起的,qemu 实现了这一点,但在我的开发中被真正的 ARM 处理器默默地忽略了板. 因此 ..
发布时间:2021-11-17 21:38:34 服务器开发

C中最严格的类型是什么意思?

The C Programming Language 一书在第 8.7 节中谈到了“最严格的类型",示例 —存储分配器: 虽然机器各不相同,但对于每台机器都有一个最严格的限制类型:如果最严格的类型可以存储在特定的地址,所有其他类型也可以.在某些机器上,最限制类型是 double;在其他情况下,int 或 long 就足够了. 在他们的代码中,union header 使用 long 类 ..
发布时间:2021-11-17 01:56:39 其他开发

在固定不同 CPU 的 2 个线程之间传递一些变量的最佳方法

我有一个问题,我需要了解是否有更好的解决方案.我编写了以下代码来将一些变量从写入器线程传递到读取器线程.这些线程固定到共享相同 L2 缓存的不同 CPU(禁用超线程). writer_thread.h struct a_few_vars {uint32_t x1;uint32_t x2;uint64_t x3;uint64_t x4;} __attribute__((aligned(64) ..
发布时间:2021-09-29 19:37:48 其他开发

内存对齐检查机制检查的地址是有效地址、线性地址还是物理地址?

我正在研究对齐检查的问题.但我不知道处理器是在检查有效地址、线性地址还是物理地址,还是全部检查. 比如一个数据的有效地址已经对齐,但是加上段描述符的基地址形成的线性地址不再对齐,此时处理器抛出#AC异常. 解决方案 TL;DR 我认为是线性地址. 继续阅读测试方法和测试代码. 它不是有效地址(也就是偏移量) 为了测试这一点,使用一个基数未对齐的段就足够了. ..
发布时间:2021-09-29 19:34:48 其他开发

在程序集 x86 中对齐

我无法理解align. 我尝试运行以下命令: section .data对齐 4xs: dw 0xA1A2ys: db 0xB1, 0xB2, 0xB3, 0xB4 看看每个字节是什么,我希望它是内存中的一个连续块,如下所示: 例如:4 5 6 7 8 9 A B(addr 可被 4 整除):[0xA2, 0xA1, 0x0, 0x0, 0xB1, 0xB2, 0xB3, 0xB4] ..
发布时间:2021-09-29 19:32:03 其他开发

Windows x64's 44 位虚拟内存地址限制的背后

http://www.alex-ionescu.com/?p=50. 我阅读了上面的帖子.作者通过单链表示例解释了为什么 Windows x64 仅支持 44 位虚拟内存地址. struct {//8 字节头超长深度:16;ULONGLONG 序列:9;ULONGLONG NextEntry:39;标题8; 第一个牺牲是减少序列的空间number 为 9 位而不是 16 位,减少最大序列 ..