Продолжение эпопеи.
# uname -a
Linux main 3.13.0-32-generic #57-Ubuntu SMP Tue Jul 15 03:51:12 UTC 2014 i686 i686 i686 GNU/Linux
Необходимо, чтобы два процесса общались через разделяемую память
Вот участок проблемного кода
_start:><------><------>mov eax, 75h ;номер системного вызова sys_ipc
<------><------><------>mov ebx, 17h ;номер функции shmget
<------><------><------>mov ecx, 571h ; key, первое что пришло в голову
<------><------><------>mov edx, 256 ;размер выделяегого сегмента разделяемой памяти
<------><------><------>mov esi, IPC_CREAT or IPC_EXCL or 666o ;флаг для создания и права доступа
<------><------><------>int 0x80 ;делаем системный вызов
<------><------><------>test eax, eax ;в eax все пучком, только не пойму почему shmid получается нулевым.
<------><------><------>jns next_0 ;если сделать два подряд вызова, то второй shmid будет уже типа 8001
<------><------><------>mov eax, 4
<------><------><------>mov ebx, 1
<------><------><------>mov ecx, error_str
<------><------><------>mov edx, 7
<------><------><------>int 0x80 ;выводим ошибку
<------><------><------>jmp exit
next_0:><------><------>mov ecx, eax ;shmid в ecx
<------><------><------>mov eax, 75h ;опять sys_ipc
<------><------><------>mov ebx, 15h ;функция shmat
<------><------><------>xor edx, edx ;в теории остальное может быть нулями, тогда система сама выберет
<------><------><------>xor esi, esi ;для сегмента разделяемой памяти адрес.но я подставлял и явный адрес
<------><------><------>xor edi, edi ;и разные флаги - все до задницы, потому что
<------><------><------>int 80h ;системный вызов возвращает в eax значение FFFFFFF2, что значит
;ошибка 14, то есть EFAULT
данная ошибка вообще не обозначена в описании shmat. После первого системного вызова можно проверить
# ipcs -m
------ Сегменты совм. исп. памяти --------
ключ shmid владелец права байты nattch состояние
0x00000571 0 root 666 256 0
, что да, сегмент создан, код работает.
но после выполнения второго системного вызова
# ipcs -m
------ Сегменты совм. исп. памяти --------
ключ shmid владелец права байты nattch состояние
0x00000571 0 root 666 256 1
080480BB 31FF xor edi, edi
ald>
eax = 0x00000075 ebx = 0x00000015 ecx = 0x00008000 edx = 0x00000000
esp = 0xBFE4EAC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000
ss = 0x007B cs = 0x0073 eip = 0x080480BD eflags = 0x00000246
Flags: PF ZF IF
080480BD CD80 int 0x80
ald>
eax = 0xFFFFFFF2 ebx = 0x00000015 ecx = 0x00008000 edx = 0x00000000
esp = 0xBFE4EAC0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds = 0x007B es = 0x007B fs = 0x0000 gs = 0x0000
ss = 0x007B cs = 0x0073 eip = 0x080480BF eflags = 0x00000246
Flags: PF ZF IF
хотя ipcs и показывает, что сегмент прикрепился, но в eax вернулась ошибка, а не адрес сегмента разделяемой памяти.
Нужна помощь. Что не так?