Форум русскоязычного сообщества Ubuntu


Получить помощь и пообщаться с другими пользователями Ubuntu можно
на irc канале #ubuntu-ru в сети Freenode
и в Jabber конференции ubuntu@conference.jabber.ru

Автор Тема: FASM работа с разделяемой памятью  (Прочитано 957 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн scurra

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
FASM работа с разделяемой памятью
« : 27 Апреля 2016, 14:13:43 »
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
lscpu
Архитектура:i686
CPU op-mode(s):        32-bit
Порядок байтов:Little Endian
CPU(s):                2
On-line CPU(s) list:   0,1
Потоков на ядро:2
Ядер на сокет:1
Сокет(ы):        1
Vendor ID:             GenuineIntel
Семейство CPU:15
Модель:          2
Stepping:              9
CPU МГц:            2400.088
BogoMIPS:              4800.47
Подскажите, где найти номера системных вызовов для моей, именно моей Ubuntu? Установлена и работает как сервер. Приложение написано на FASM, поиск в /usr/src/ любых файлов, содержащих shmget, shmat, shmctl, shmds ни к чему не привел. Все найденные unistd.h или syscalls_32.h не подходят к моей Ubuntu, поскольку некоторые номера системных вызовов, которые уже работают в приложении, не совпадают с номерами в этих файлах . Нужно организовать обмен данными между процессами через разделяемую память. Был найден единственный файл /usr/src/linux-headers-3.13.0-32-generic/arch/x86/include/generated/asm/syscalls_32.h в котором номера системных вызовов работают правильно. Но в нем нет ни одного системного вызова для работы с разделяемой памятью.

Оффлайн scurra

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: FASM работа с разделяемой памятью
« Ответ #1 : 29 Апреля 2016, 18:58:21 »
Тему можно удалить. В доступных системных вызовах нашел sys_ipc , в котором есть все, что нужно - и разделяемая память, и семафоры и проч. :D

Оффлайн scurra

  • Автор темы
  • Новичок
  • *
  • Сообщений: 8
    • Просмотр профиля
Re: FASM работа с разделяемой памятью
« Ответ #2 : 03 Мая 2016, 12:37:17 »
Продолжение эпопеи.
# 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 вернулась ошибка, а не адрес сегмента разделяемой памяти.
Нужна помощь. Что не так?

 

Страница сгенерирована за 0.091 секунд. Запросов: 25.