QNX RTP Logo QNX Realtime Platform: Русский Портал QNX
Thursday, 4 Dec 2008 00:32
Меню

Проект OpenNET - все о Unix
Главная

 · Начало · Статистика · Поиск ·

  QNX.ORG.RU —› Перенос приложений в QNX —› resource manager

Посл.ответ Сообщение


Дата: 8 Апр,  13:43

Переношу проект из под Linux.
В *.so файле есть много ioctl(...) выозовов к модулю ядра. В QNX столкнулся с тем, что при использовании ioctl() вызова для передачи например массива в менеджер ресурсов передаются только первые четыре байта. Подскажите, как получить остальные?
Сейчас нацарапал функцию обертку над devctl(), которая по коду команды передает еще и количество байт. Так вроде работает, но не красиво. Может ссылочкой поделится кто, или где прочитать во встроенной документации подробнее.
Спасибо.


Дата: 9 Апр,  09:35

Подскажите, как получить остальные?


Надо оставить заявку на сайте www.qnx.com , в ближайшее время вам вернут оставшиеся байты.

idle, как ты формируешь ioctl? Как отправляешь? Где код? Не спрашиваю под каким qnx'ом ты мучаешься, ведь это неприлично спрашивать, да?


Дата: 9 Апр,  11:28

Приношу свои извенения за допущенные оплошности .
QNX 6.3.2

код запроса со стороны пользователя:

int ioctl( int fd, int cmd, ... )
{
va_list ap;
unsigned long arg = 0;

va_start(ap, cmd);
arg = va_arg(ap, unsigned long);
va_end(ap);

if(!arg) {
fprintf(stderr, "Invalid parameters: arg = %lx ", arg);
return(EINVAL);
}

//по cmd возвращает количество байт
size_t nbytes = get_size_by_cmd( cmd );

int res = devctl(fd, cmd, (void*)arg, nbytes, NULL);
if(0 > res) {
fprintf(stderr, "Error: %s ", strerror(errno));
return res;
}

return 0;
}

код обработчика _IO_DEVCTL со стороны менеджера ресурсов:

int dev_ctl(resmgr_context_t *ctp, io_devctl_t *msg, RESMGR_OCB_T *ocb)
{
int nbytes, status;

if (((uint32_t)status = iofunc_devctl_default(ctp, msg, ocb)) != _RESMGR_DEFAULT) {
return(status);
}

status = nbytes = 0;

nbytes = msg->i.nbytes;
memset( dev->get_ioctl_buf_addr(), 0, nbytes );
resmgr_msgread(ctp, dev->get_ioctl_buf_addr(), nbytes, sizeof(msg->i));

status = dev->dev_ioctl( dev->get_ioctl_buf_addr(), msg->i.dcmd, &nbytes );
if(0 > status) {
fprintf(stderr,
"dev_ctl: Error in adp_ioctl(). "[img]http://qnx.org.ru/components/minibb/img/smilies/wink.gif[/img];
return(EINVAL);
}

resmgr_msgwrite(ctp,
dev->get_ioctl_buf_addr(),
nbytes,
sizeof(msg->o));

memset(&msg->o, 0, sizeof(msg->o));

msg->o.ret_val = status;
msg->o.nbytes = nbytes;

return( _RESMGR_PTR(ctp, &msg->o, sizeof(msg->o)));
}

dev::get_ioctl_buf_addr() - возвращает адрес буфера который выделяется при создании объекта dev.

dev::dev_ioctl(void *buf_addr, int cmd, uint32_t *nbytes) - обрабатывает запрос, помещая в буфер объекта dev массив с данными из менеджера ресурсов, возвращая в nbytes - число положенных в буфер байт.

int ret = ioctl( fd, IOCTL_GET_BRD_INFO, &sGetInfo );

Спасибо.


Дата: 9 Апр,  19:06

А где же неработающий ioctl?


Дата: 9 Апр,  20:05

Так это "моя реализация" ioctl обертки, а не работающий - вызов тот, что в системе по умолчанию. Если я в *.so вместо своей обертки использую системный вызов - то получаю копирование только первых 4 байт, остальное - 0. Подскажите, куда копать.
Спасибо.


Дата: 11 Апр,  14:42

idle
Подскажите, куда копать.

Куда копать не подскажу,
но можете глянуть (может что подскажет по devctl()):
http://www.qnxclub.net/modules.php?name=Forums&file=viewtopic&t=299
http://www.qnxclub.net/modules.php?name=Forums&file=viewtopic&t=317
http://www.qnxclub.net/modules.php?name=Forums&file=viewtopic&t=326
-в последнем URL есть архив проекта с работающей реализацией.


Дата: 11 Апр,  19:42

Спасибо за ссылочки.
Еще один вопрос, относительно mmap(). Хочу отмапить кусок памяти из области регистров управления устройства, но это получается сделать только из под root. Можно-ли сделать это от имени обычного пользователя?
Вызов mmap() следующий:
pDevMemoryVA = mmap(NULL, devMemLen, PROT_READ|PROT_WRITE,
MAP_SHARED |MAP_PHYS ,
fd, (off_t)offset );
Просто в документации сказано, что для отображения с флагами MAP_SHARED | MAP_PHYS нужны права root.


Дата: 11 Апр,  21:58

idle
Еще один вопрос, относительно mmap(). Хочу отмапить кусок памяти из области регистров управления устройства, но это получается сделать только из под root. Можно-ли сделать это от имени обычного пользователя?

О чём-то похожем есть в конце темы:
http://qnxclub.net/modules.php?name=Forums&file=viewtopic&t=341
- может чем поможет?
Если сказано root - то root, доктор строгий (или sudo).


Дата: 14 Апр,  21:13 · Поправил: domo

ResMgr пусть работает из под root, зачем же над ним издеваться?


Дата: 16 Апр,  10:57

domo
ResMgr пусть работает из под root, зачем же над ним издеваться?


Он и работает из под root. А вот пользовательское приложение не может вызвать mmap() для отображения памяти устройства.
Кстати, почему-то мой обработчик сообщения _IO_MMAP в менеджере ресурсов (могу ошибиться) не вызывается. Но системный меня вполне устраивает, как выяснилось позднее, за исключением вышеупомянутой особенности.

You must login to post.

©   2000-2003 Команда проекта QNX.ORG.RU // QNX.ORG.RU Team
Авторы проекта: Дмитрий Алексеев [dmi] и Дмитрий Васильев. Техническое сопровождение проекта: Игорь Сорокин [isorokin]. Информационное сопровождение: Дмитрий Алексеев [dmi]
QNX - зарегистрированная торговая марка QNX Software Systems, Ltd., Canada. Остальные упоминаемые на сайте торговые марки и логотипы являются исключительно собственностью их уважаемых владельцев. Ничьи права не затронуты. Материалы сайта не могут быть скопированы и где-либо использованы в той или иной форме без письменного разрешения разработчиков сайта.
Powered by Mambo Open Source