2014-10-20 2 views
0

Я использовал posix shared memory в mips. программа жалуется:Posix shared memory причина ошибка шины

i: 516095 
i: 516096 
Bus error 

Та же самая программа, выполняемая в x86, в порядке. Я хочу получить размер памяти общей памяти ядра max.

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; 
} 

У меня есть чек МПБЫ, но человек говорит:

утилит Linux МПБЫ не полностью совместим с утилитой POSIX ИНКОЙ.

[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, но моя программа может использовать (516096/1024 = 504K)?

Я смущен sysv ipc vs posix ipc?

+0

Почему 'shm_unlink' называется так рано? –

ответ

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) гораздо позже, чем вы, то есть после того, как все использование совместно используемой памяти.

Смежные вопросы