c - 为什么 shm_open 创建的 memset 共享内存会导致 aarch64 上的 sigbus err
问题描述
请有人帮助解决 arm 上的以下共享内存问题,为什么 memset 失败?
内核架构 - aarch64
用户拱门 - 手臂
每次 dolagent.app 运行时,都会发生 sigbus err,backtrace with core 显示 memset 是最后一行,
create shared memdolagent.app[961]: unhandled level 3 translation fault (7) at 0xf69b1000, esr 0x92000047
pgd = ffffffc0142f6000
[f69b1000] *pgd=000000001b5ae003, *pud=000000001b5ae003, *pmd=00000000140a1003, *pte=0000000000000000
CPU: 3 PID: 961 Comm: dolagent.app Tainted: P 4.1.45 #4
Hardware name: Broadcom-v8A (DT)
task: ffffffc01c30cac0 ti: ffffffc014268000 task.ti: ffffffc014268000
PC is at 0xf6a46670
LR is at 0x3961b8
pc : [<00000000f6a46670>] lr : [<00000000003961b8>] pstate: 200d0010
sp : 00000000ffae4c78
x12: 0000000000000000
x11: 00000000ffae4c7c x10: 00000000f715f000
x9 : 0000000000000000 x8 : 0000000000000000
x7 : 0000000000000000 x6 : 0000000000149f00
x5 : 0000000000000000 x4 : 000000000096d984
x3 : 00000000f69b1000 x2 : 000000000000e0f8
x1 : 0000000000000000 x0 : 00000000f69b1000
potentially unexpected fatal signal 7.
代码:
void showTechShareMemoryInit(void)
{
int fd;
if((fd = shm_open("/showTechShm",O_RDWR|O_CREAT,0777)) == -1)
{
printf("showTech shm_open failed.\r\n");
exit(1);
}
if(ftruncate(fd,sizeof(showTechElementT)*MAX_SHOWTECH_NUM) == -1)
{
printf("showTech ftruncate failed.\r\n");
exit(1);
}
if((showTechElements = mmap(NULL,sizeof(showTechElementT)*MAX_SHOWTECH_NUM,
PROT_READ|PROT_WRITE,MAP_SHARED,fd,0)) == MAP_FAILED)
{
perror("showTech mmap failed");
exit(1);
}
if(showTechElements == NULL)
{
exit(1);
}
memset(showTechElements, 0, sizeof(showTechElementT)*MAX_SHOWTECH_NUM);
}
注意:struct showTechElements 是用__attribute((aligned (4)))
.
#define MAX_SHOWTECH_NUM 300
sizeof(showTechElementT)
会得到192
解决方案
推荐阅读
- javascript - 如何根据位置打印出某些元素?
- r - 在 R 中绘制 native-land.ca json
- java - 如何在 kotlin 中修改或生成代码?(不仅是 JVM)
- google-cloud-platform - 谷歌函数构建失败:发现不兼容的依赖项(Python)
- go - 使用反射确定结构字段是否不完整 Cgo 类型
- reactjs - useMemo 不影响组件渲染
- c++ - 使用所有英特尔编译器时打开 CMake MSVC 变量
- c++ - How to only use some of the optional arguments of a function
- django - 在 Django 中删除表条目
- html - 滚动一个绝对正确的 div