Пожалуйста, кто-нибудь поможет с проблемой с разделением памяти на руке, почему не работает memset?
kernel-arch - aarch64
user-arch - arm
каждый раз, когда dolagent.запуск приложения, произошла ошибка sigbus, обратная трассировка с ядром показывает, что 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