相关疑难解决方法(0)

如何在x86上捕获数据对齐错误(在Sparc上也称为SIGBUS)

是否有可能在i386上捕获数据对齐错误?也许通过设置i386特定的机器寄存器或类似的东西.

在Solaris-Sparc上我在这种情况下收到一个SIGBUS,但在i386上一切都很好.

环境:

  • 32位应用程序
  • Ubuntu Karmic
  • gcc/g ++ v4.4.1

编辑:这就是为什么我这样问:

  • 我们的应用程序在使用SIGBUS的Sol-Sparc上崩溃了.出于调试的目的,我会尝试在i386平台上获得类似的行为.
  • 我们的Sol-sparc机器非常慢,因此编译和调试需要很长时间.我们的i386机器速度令人难以置信(8核,32G内存).
  • 即使在i386平台上,数据对齐错误也会带来性能损失.因此,我想尽可能修复数据对齐错误.

c c++ gcc g++

15
推荐指数
2
解决办法
4363
查看次数

从char*数组中读取"整数"大小的字节.

我想sizeof(int)char* 数组中读取字节.

a)在什么情况下我们需要担心是否需要检查字节序?

b)如何考虑或不考虑字节顺序,您将如何读取前4个字节.

编辑:sizeof(int)我读取的字节需要与整数值进行比较.

解决这个问题的最佳方法是什么?

c c++ endianness

14
推荐指数
3
解决办法
3万
查看次数

为什么在AMD64上对mmap内存的未对齐访问有时会出现段错误?

我有这段代码在AMD64兼容CPU上运行Ubuntu 14.04时会出现段错误:

#include <inttypes.h>
#include <stdlib.h>

#include <sys/mman.h>

int main()
{
  uint32_t sum = 0;
  uint8_t *buffer = mmap(NULL, 1<<18, PROT_READ,
                         MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
  uint16_t *p = (buffer + 1);
  int i;

  for (i=0;i<14;++i) {
    //printf("%d\n", i);
    sum += p[i];
  }

  return sum;
}
Run Code Online (Sandbox Code Playgroud)

如果使用分配内存,则仅此段错误mmap.如果我使用malloc,堆栈上的缓冲区,或全局变量,它不会段错误.

如果我将循环的迭代次数减少到少于14的次数,则不再是段错误.如果我从循环内打印数组索引,它也不再是段错误.

为什么未对齐的内存访问能够访问未对齐地址的CPU上的段错误,为什么只有在这种特定情况下呢?

c gcc mmap x86-64 auto-vectorization

5
推荐指数
1
解决办法
1608
查看次数

对于不同的数据类型,内存对齐是否不同

不要用C不同的数据类型,例如char,short,int,long,float,double有不同的内存边界对齐?在一个32位字对齐的字节可寻址操作系统中,如何访问charshort访问一个int或多个float?在这两种情况下,CPU是否读取完整的32位字?当一个人int不在边界时会发生什么?如何char在任何内存地址读取?

c alignment

4
推荐指数
2
解决办法
4290
查看次数

标签 统计

c ×4

c++ ×2

gcc ×2

alignment ×1

auto-vectorization ×1

endianness ×1

g++ ×1

mmap ×1

x86-64 ×1