Я собираю некоторую память io для vmalloced области в драйвере. Я также разделяю эту область с пользовательскими процессами, используя флаг (PAGE_SHARED
в ioremap_page_range).системные вызовы, не соответствующие iomapped памяти в Linux.
Теперь я могу получить доступ к этой общей памяти в пространстве пользователя. Я могу писать и читать эту память. Однако, если я передаю эту память в качестве буфера для системных вызовов, например recv
или send
, тогда сбой вызовов происходит с плохой памятью (Memory not mapped into user process
).
Однако, я уверен, что у моего буфера нет никаких проблем. Таким образом, кажется, что существует некоторый конфликт в том, как я использую память и проверку ошибок для системных вызовов.
код драйвера:
shared_buf = __get_vm_area(size, VM_IOREMAP, VMALLOCS_START, VMALLOC_END);
ioremap_page_range(shared_buf->addr, size, phy_addr_of_io, PAGE_SHARED);
После того, что я делаю вызов IOCTL и передать этот shared_buf-> адр в приложение пользовательского пространства.
Я пишу и читаю, используя этот addr. Тогда я
ret = recv(sockfd, shared_buf->area, 0) and I get an error "bad addr".
Вместо того, что если я попытаюсь
ret = recv(sockfd, local_buf, size, 0);
memcpy(shared_buf->addr, local_buf, size); Then it goes without issues.
(Отказ от ответственности:.. Я использую shared_buf->area
в потоках, которые не сделали IOCTL Однако это тот же процесс)
Может ли кто-нибудь увидеть ошибку?
Показать код. –
обновил сообщение. –
Возможно, вы захотите обновить это снова, чтобы дать вашему запросу 'recv' достаточно аргументов. – Nemo