工具与软件:
假设我按如下方式创建了一个存储器映射:
inf mem_file = open("/dev/mem", O_RDWR | O_SYNC );
// choose some physical address that is reserved and safe to use
void * vaddr = mmap(0, 64*1024, PROT_READ | PROT_WRITE, MAP_SHARED, mem_file, 0x91000000);
在我的 AM62系统上、如果我 memset () vaddr、我的应用程序将被抛出 SIGBUS。 但是、对于循环和基于指针的访问、请使用带规则的 vaddr、没有此类错误。
虽然我可以使用基于对齐指针的访问与映射的存储器进行交互、但尝试将该区域设置成内存会触发一个 SIGBUS。
起初,我以为这可能是一个`memset ()`问题,但这并没有太大的意义,因为到现在,这将出现在其他用例。 另外、如果我尝试此操作:
char some_mem[64*1024]; memset(some_mem,0,64*1024);
正如预期的那样、它运行正常。
所以,我的直觉是,在内核层面的某个东西,在"/dev/mem "下面是导致一个对齐错误或触发了 SIGBUS 的东西。
如果上述少量信息不足以揭示问题、请告知我、我可以创建一个重现问题的最低示例。 唯一需要注意的是、它可能需要 devicetree tweak 来保留一些存储器、以便可以安全地执行测试。
此致、
António μ A