2012-03-29 9 views
4

いくつかの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". 

を行います

誰かが間違いを見ることができますか?

+0

私たちにコードを教えてください。 –

+0

がポストを更新しました。 –

+0

これをもう一度更新して、 'recv'コールに十分な引数を与えることができます。 – Nemo

答えて

3

システムコールはすべて、渡されたポインタがアドレス空間のユーザ部分にあることを検証します。 vmallocスペースはこのユーザー部分にはありません。したがって、システムコールには使用できません。さらに重要なことは、ユーザープロセスがvmallocアドレス空間のメモリに直接アクセスすることを禁じることです。それはただのトラブルを求めているだけです。おそらく恐ろしく不安です - 他のプロセスもそれにアクセスできますか? an mmapable file insteadと書いてください。

+0

@bdolan:私はある種の問題がありました.Addrがユーザ空間にあるかどうかをチェックする必要があります。しかし、私はまた、なぜチェックがページテーブルのスーパバイザビットで行われないのだろうと思っていました。カーネル開発者は、プログラマーがカーネルバッファーを使用することを期待していないかもしれません。 (私はmmapがそれについて行く儀式であることを知っています。)私はmemを共有するこの恐ろしい方法を使って、何かを素早く点検したいと思っていました。ありがとう。 –

+0

@ agent.smithでは、実際にページテーブルのページを検索するのは_slow_です。カーネルは、ユーザー空間の範囲にあるかどうかを確認した後、直接アクセスします(リング0の場合でも、CPUは存在しないビットまたはライトプロテクトビットを守ります)。唯一の例外は、カーネルが実際にページテーブルをチェックするいくつかの非常に初期のモデル386プロセッサですが、やはりこれはかなり遅いです。 – bdonlan

関連する問題