いくつかのioメモリをドライバのvmallocedエリアにマッピングしています。また、この領域をフラグ(ioremap_page_rangeのPAGE_SHARED
)を使用するユーザープロセスと共有しています。linuxのiomappedメモリにシステムコールが失敗しました。
今、この共有メモリにユーザー空間にアクセスできます。私はこのメモリに書き込んで読み込むことができます。しかし、このメモリをバッファにして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のを渡します。
このアドレスを使用して書き込みと読み取りを行います。 (。。:私はIOCTLをしていないスレッドでshared_buf->area
を使用するのですが、それは同じプロセスさ免責事項)
ret = recv(sockfd, local_buf, size, 0);
memcpy(shared_buf->addr, local_buf, size); Then it goes without issues.
をしようそれから私はその代わりの
ret = recv(sockfd, shared_buf->area, 0) and I get an error "bad addr".
を行います
誰かが間違いを見ることができますか?
私たちにコードを教えてください。 –
がポストを更新しました。 –
これをもう一度更新して、 'recv'コールに十分な引数を与えることができます。 – Nemo