2017-10-13 2 views
0

Linuxでは、mmapを使用して、プロセスの仮想アドレス空間にマッピングを作成できます。その使用事例の1つは、非常に大きなファイルで作業しています。残念ながら、既に始まって連続していたものに対してのみマッピングを作成することができます:offsetlengthの1つだけを受け入れます。ユーザーランドのセグメント化されたメモリからマッピングを作成するには?

私は、メモリ内の複数のセグメントを1つの連続したアドレス範囲にマッピングするソリューションを探しています。このユーザーは、実際にディスク上で断片化されたファイルの連続したアドレス範囲を提示したいユーザー空間で動作するNTFSドライバーになります。私の理解では、これはカーネルで動くドライバでは可能ですが、私は特にユーザー空間での解決策を探しています。

解決策はC/C++である必要があります。私はカーネルのバージョンに関しては何の要件も持っていません。これまでは、セグメントごとにジャンプする方法を知っているイテレータを書くことが最善のアプローチでしたが、文字配列だけを受け入れるライブラリとのやり取りもしたいと考えています。

私はこれが私の質問を横取りしてくれることを願っています。どんなアドバイスも大歓迎!

答えて

1

残念ながら、それだけですでにで開始する連続した何かのためのマッピングを作成することができます:それはちょうど1 offsetを受け入れ、length

それは一度に1 offsetlengthを受け入れ、あなたは何度もmmap多くを呼び出すことができます。

void *mmap(void *addr, size_t length, int prot, int flags, 
      int fd, off_t offset); 

スタート(多分/dev/zero、おそらく)一つの大きなマッピングを作成することによって:man 2 mmapから

は、addr引数に注意してください。次に、そのマッピングの部分をどのように再マッピングしますか。再マップするには、開始アドレスをaddrに渡し、MAP_FIXEDを使用します。

+0

迅速な対応をありがとうございます。マニュアルページには、「MAP_FIXED - アドレスをヒントとして解釈しないでください:マッピングを正確にそのアドレスに置きます_addrはページのサイズの倍数でなければなりません._」だからあなたは自由にあなたが望む任意の住所を接着することができないようです。または、最初のmmapが作成されたら、これはもはや適用されませんか? – delins

+0

@delins: 'offset'はページサイズの倍数でなければならないことに注意してください。基本的には、すべてがページサイズの倍数でなければなりません。これは、プロセッサ上のMMUがどのように機能するかを反映します。だから、 'mmap'は、アドレスがページサイズの倍数である限り、一緒にアドレスを貼り付けることができます。 –

+0

これは残念です。個々のセグメントは、ページサイズ(理論上の最小1バイト)未満を含む任意のサイズを有することができる。関係なく良いアイデア! – delins

関連する問題