2014-10-20 46 views
0

我使用了以mips为单位的posix共享内存。程序抱怨:Posix共享内存导致总线错误

i: 516095 
i: 516096 
Bus error 

在x86中执行相同的程序是好的。我想获得内核最大支持共享内存大小。

int ret; 
int bufsize = 517120; 

shmfd = shm_open(NAME_SHM, O_RDWR|O_CREAT|O_EXCL, FILE_OP); 
shm_unlink(NAME_SHM); 
if(shmfd < 0) { 
     sys_err("Create share memory failed: %s\n", strerror(errno)); 
     exit(-1); 
} 

ret = ftruncate(shmfd, bufsize); 
if(ret < 0) { 
     sys_err("Alloc share memory failed: %s\n", strerror(errno)); 
     exit(-1); 
} 

char *ptr = mmap(NULL, bufsize, 
     PROT_READ|PROT_WRITE, MAP_SHARED, shmfd, 0); 
if(ptr == MAP_FAILED) { 
     sys_err("Mmap failed: %s\n", strerror(errno)); 
     exit(-1); 
} 

struct stat buf; 
fstat(shmfd, &buf); 
printf("size: %d, total: %d\n", buf.st_size, bufsize); 

int i; 
for(i = 0; i < bufsize; i++) { 
     printf("i: %d\n", i); 
     ptr[i] = 0; 
} 

我有检查IPCS,但男子说:

Linux的IPCS工具是不是在POSIX IPCS工具完全兼容。

[email protected]:~# ipcs -lm 

------ Shared Memory Limits -------- 
max number of segments = 4096 
max seg size (kbytes) = 3 
max total shared memory (pages) = 2097152 
min seg size (bytes) = 1 

[email protected]:~# cat /proc/sys/kernel/shmmax 
3740 

[email protected]:~# cat /proc/sys/kernel/shmall 
2097152 

[email protected]:~# cat /proc/sys/kernel/shmmni 
4096 

最大赛格大小为3K,但是我的程序可以使用(一千零二十四分之五十一万六千零九十六= 504K)?

我很困惑sysv ipc vs posix ipc?

+0

为什么'shm_unlink'被这么早叫什么名字? – 2014-10-20 10:45:57

回答

1

shm_unlink()仅在shm_open()之后被调用,因此这将删除共享内存对象名称,并且一旦所有进程都已取消映射该对象,就会取消分配并销毁相关内存区域的内容。在成功完成shm_unlink()之后,尝试shm_open()具有相同名称的对象将失败(除非指定了O_CREAT,在这种情况下会创建一个新的独立对象)。

因此,您遇到了一个总线错误,这是由于处理器检测到总线上的异常情况而导致的机器语言指令执行的致命故障。可能由于无效的地址对齐(访问奇数地址处的多字节数字)或访问其地址空间之外的存储器位置不存在。

此外,您可能需要检查资源限制和设置你的程序所需的正确的限制(如规模较小的),使用sysctl命令

$ipcs -l 

------ Shared Memory Limits -------- 
max number of segments = 4096 
max seg size (kbytes) = 32768 
max total shared memory (kbytes) = 8388608 
min seg size (bytes) = 1 

------ Semaphore Limits -------- 
max number of arrays = 128 
max semaphores per array = 250 
max semaphores system wide = 32000 
max ops per semop call = 32 
semaphore max value = 32767 

------ Messages Limits -------- 
max queues system wide = 15747 
max size of message (bytes) = 8192 
default max size of queue (bytes) = 16384 
1

在Linux上,您可以使用proc(5)伪文件在/proc/(读取它们的速度很快;您需要像管道一样顺序读取它们并快速关闭它们)。

尤其是,您可能会读/proc/sys/kernel/shmmax & /proc/sysvipc/shm等等

又见shm_overview(7)

你或许应该都使用共享内存的调用后shm_unlink(3)远远晚于你做,即。