【问题标题】:Memory (sbrk) 16-byte aligned shifting on pointer access内存 (sbrk) 指针访问时 16 字节对齐移位
【发布时间】:2010-11-30 20:29:24
【问题描述】:

我使用 sbrk 编写了一个相当基本的内存分配器。我要求一块内存,比如 65k,并根据需要将其划分为请求动态内存的变量。我通过将内存添加回 65k 块来释放内存。 65k 块源自 union sizeof(16-bytes)。然后我将块沿偶数 16 字节边界对齐。但我的行为异常。

当我分配并开始填充我的数据结构时,访问内存看起来不错直接发送到该成员的地址。

例如,这个特定成员的真实地址恰好是:0x100313d50,但在执行特定函数时(没什么特别的),该成员的地址被表示为 0x100313d70。在调试器内部,我可以查询真实地址,并且在它出现的函数内部时它看起来是正确的。这也不是第一个被访问的成员,它是第三个,因此之前的两次内存访问都很好,但是在第三次访问期间,我看到了这种不寻常的转变。

我是否有可能通过未对齐的块访问此内存?这是可能的,但我希望会引发 SIGBUS 异常(SPARC 芯片)。我正在使用 -memalign=16s 进行编译,所以它应该使用 SIGBUS 而不是捕获和修复错位。

我的所有结构都填充在 16 字节的倍数上:sizeof(structure)%16 = 0。有人遇到过这种行为吗?一般来说,什么类型的东西/东西/等等。可能会导致指针错误表示内存地址?

干杯, 特蕾西。

现代 SPARC 处理器上的 Solaris 10、SunStudio-12、C 语言(如果有帮助的话)。

【问题讨论】:

  • 我刚刚尝试使用 malloc 而不是 sbrk 并且行为是相同的。
  • 嗯,它看起来与我的内存分配器无关。我用普通的旧 malloc 和 free 替换了所有动态内存请求,具有相同的行为(不同的内存位置),但在同一个结构成员上具有相同的奇数指针偏移量。

标签: pointers memory-management memory-alignment sbrk memory-access


【解决方案1】:

如果其他人有类似的问题,我想我应该回答我自己的问题。

内存地址发生移动的原因是因为先前调用实用程序函数意外覆盖了全局结构的元地址,因此重写了该块的元地址,因此即使实际在该块上的查找也发生了移动数据仍然驻留在原始块中。

简单来说,我写过了我的缓冲区。由于我从尾部分配内存,因此覆盖会吹走我急需的全局结构(或其他)的元地址。现在我知道未定义的行为是什么样的了。

【讨论】:

  • 确切地说,您知道未定义行为的一个示例是什么样的。还有可能还有一百万;)
  • +1 表示最后一句话。 @Mikeage:我认为 OP 的意思是“未定义的行为是什么样的”,即试图追踪意外且难以解释的程序行为的整个体验。
  • 听起来您在每次分配之前存储了内存分配器的控制结构的地址,因此对释放内存的调用可以找到该结构?如果是这样,我使用的替代方法是将整个页面对齐在 64k 边界上。然后如果我需要释放分配,我可以通过以下方式找到控制结构:pctrl = pvFreeing & ~0xffff;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-02
  • 2016-12-19
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多