【发布时间】: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