Я сопоставляю некоторую память ввода-вывода с областью vmalloced в драйвере. Я также делюсь этой областью с пользовательскими процессами, используя флаг (PAGE_SHARED
в ioremap_page_range).
Теперь я могу получить доступ к этой общей памяти в пространстве пользователя. Я могу писать и читать в эту память. Однако, если я передам эту память в качестве буфера для системных вызовов, таких как 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
вызову достаточно аргументов. - person Nemo   schedule 30.03.2012