問題タブ [memory-mapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 「競合する」バイナリ形式に関する高速バイナリの読み取りと書き込みの問題
バイナリ (ファイル) データ (c#) の処理に苦労しています。これは状況です:
最小で 1 MB、最大で 60 GB のバイナリ ファイルがあるため、メモリに収まりません (32 ビットと 64 ビットの両方の Windows を実行する 2 GB RAM の遅いラップトップを想定します)。このファイルには、たとえば、時間軸に沿った 20 のソースからのデータが含まれています。ファイルのヘッダーは、信号の長さについては通知しません。つまり、各信号の長さは異なる可能性があります (ほとんどの場合は異なります)。したがって、1 つの信号にフォアハンドで含まれるバイト数はわかりません。また、データがファイルに沿って不均等に配置されていることにも注意してください。したがって、対応する信号サンプルに一致するファイル内の識別子 (2 バイト) を検索する必要があります。
次に、このデータを処理して新しいバイナリ ファイルに保存する必要があります。ファイルサイズはほぼ同じになります。しかし、バイナリ形式はまったく異なります。実際、これは Matlab バイナリ ファイル形式です。
課題は次のとおりです。
- Matlab バイナリでは、信号のヘッダーに信号の長さ (バイト数として指定) が必要なので、前もって長さを知る必要があります。または、最後に書き込まれたバイナリをシークして、長さを保存します。
- パフォーマンスは非常に優れている必要があります。ターゲットがハードディスクの r/w 速度に近づいているため、CPU 時間を低くする必要があります。
- データは内部メモリに収まらないため、ソートブロックごとの処理が必要です。しかし、パフォーマンスをあまり犠牲にせずにメモリオーバーフローの例外が発生しないように、ブロックサイズを正しく制限するにはどうすればよいですか?
読み込むファイルのメモリ マッピングは既に試しましたが、信号の長さを知るにはファイル全体を検索する必要があるため、これで行き詰まっています。
上記を達成するための良いアプローチは何ですか?
linux - 複数のデータ配列を任意の固定メモリ アドレスにマッピングする
私は、任意の長さの複数のデータ配列を、制御できない固定メモリアドレスにマップする必要がある64ビットLinuxマシンでプログラムに取り組んでいます。MAP_FIXED と MAP_ANONYMOUS を使用した mmap() が最適だと思いました。たとえば、次のようになります。
ただし、この関数を呼び出すたびに MAP_FAILED が返されます。fdを -1 に設定しました。これは一部のシステムで必要であることがわかっています。アドレスはページ サイズ (4096) の倍数であり、長さは負ではないため、おそらく 0x401000 が既に実行されているのではないかと考えています。私のシステムで使用されています。0x402000、0x403000、および 0x404000 も同じ結果で試しました。
mmap() について私が見逃しているものはありますか、またはこのアドレスに既にあるものを見つける方法はありますか? さらに良いことに、必要なアドレスを制御できないため、既存のマッピングに遭遇しないようにするためのより良い方法はありますか?
編集: を確認errno
したところ、取得しているコードが無効な引数であることがわかりました。そのため、man ページによると、「addr、length、または offset は好きではありません (たとえば、大きすぎる、または整列していない)ページ境界上)」。しかし、どちらが問題なのかはまだわかりません。
c++ - シンプルなプロセスローダーのメモリマッピング
Linux 用の非常に単純なプロセス ローダーを作成しています。ロードしている実行可能ファイルは既にコンパイルされており、それぞれがメモリ内のどこにあると予想されるかを知っています。私が試した最初のアプローチは、次mmap()
のように、各コードまたはデータ セクションを正しい場所に手動で配置することでした。
MAP_FIXED フラグを削除しない限り、セグメンテーション違反が発生します。これは、1 つのブロックのアドレスが既にメモリ内にある何か、おそらくローダー自体と競合しているように思われるためです。アドレス0x401000
が問題のようです。
私はこれをどこから始めるべきかさえよくわかりません。友人は、メモリアクセス操作を仮想化することを提案しました。そのためにどのようなパフォーマンス ヒットが発生するかはわかりません。また、それがどのように行われるかもわかりませんが、オプションになる可能性があります。私が本当にやりたいのは、「空の」プロセスを作成することです。これは、それに関する限り、メモリを完全に実行するため、必要になるまでユーザー空間には何もロードされません。「空の」プロセスの概念全体は無意味かもしれませんが、それは私が望むものを説明する最良の方法です. 私は、私を助けるかもしれないいくつかの参照や例を切望しています。
c# - C#の2つのプロセス間でオブジェクトを共有する
2つのプロセス間でオブジェクトを共有する方法を探しています。最初のプロセスではオブジェクトを作成し、2番目のプロセスでは元のプロセスに変更を加えずにオブジェクトをコピーする必要があります。
誰かがそれを行う方法を知っていますか?
c - 実行可能Cプログラム内のセグメント
私はセクションとセグメントについて読んでいました。セクションとセグメント間のマッピングを以下のようにリストできるようです。
私の質問、
- プログラムヘッダーの意味がわかりませんでしたか?それらはセグメントとどのように関連していますか?
- セクションからセグメントへのマッピングは明確です。しかし、誰かがそれに名前を付けることができますか?数字しか見えません。コードセグメント(03)、データセグメント(02)、スタック(07)を特定しました。
driver - 仮想メモリシステムのデバイスドライバ
メモリマップドI/Oを使用するデバイスがある、つまり、このデバイスに割り当てられた物理メモリの特定の範囲があると想定します。
仮想メモリシステムが使用されていない場合、対応する物理アドレスを使用して実行される読み取り/書き込み操作を通じてデバイスを操作するのは非常に簡単です。
仮想メモリシステムがある場合はどうなりますか?
デバイスドライバは、そのデバイスに割り当てられた物理メモリの特定の範囲を認識する必要がありますが、物理ではなく仮想アドレスを使用する必要がある場合、どのようにそのアドレス範囲にアクセスしますか?
c - 指定されたアドレスを使用していない Mmap
要求されたマッピング アドレスはページ開始ですが、数ページ分シフトされたアドレスが使用されます。
私はこのようなことをしようとしています:
出力例 ( page_size
= 4096
= 0x1000
):
オフセットは 2 ページです。これも によって異なるようlength
です。たとえば、1 ページではなく 4 ページをマップしようとすると、出力は次のようになります。
これは 5 ページのオフセットです。
なぜこのように振る舞うのですか?
linux - Linuxのユーザースペースから物理アドレスにアクセスするにはどうすればよいですか?
Linuxを実行しているARMベースのシステムで、物理アドレスにメモリマップされたデバイスがあります。すべてのアドレスが仮想であるユーザースペースプログラムから、このアドレスからコンテンツを読み取るにはどうすればよいですか?
linux-kernel - Linux のブロック IO デバイスでのメモリ マッピング
私は Linux でデバイス ドライバーの開発を行っていました。Linux でのデバイス ドライバーのメモリ マッピングに遭遇しました。
RAMディスクブロックデバイスドライバー(RAMから仮想ディスクを作成する)を開発しようとしていました。しかし、ここでメモリ マッピングを使用する方法がわかりませんでした (試してみるためだけに)。
ブロックデバイスはメモリマッピングを使用していたと思います。
誰かがこれに光を当てることができますか?
また、remap_pfn_range を使用してユーザー空間にメモリをマップすると、どのように機能しますか? ユーザーが単にリージョンに何かを書き込むと、デバイス内に自動的に反映されるのでしょうか、それとも I/O 用に登録されたリクエスト関数が呼び出されるのでしょうか?
c - アプリケーション プログラマがサンクからポインタを作成できるオペレーティング システムはありますか?
多くのオペレーティング システムでは、マップ ファイルをメモリに保存し、遅延して読み取ることができます。オペレーティング システムがこれを行うことができれば、サンクから通常のポインタを作成する力が効果的に得られます。
アプリケーション プログラマが自分のサンクからポインタを作成できるオペレーティング システムはありますか?
パイプを作成し、それをメモリにマップし、プロセスをパイプに接続して、私が話していることのいくつかを達成できるため、限られた範囲でオペレーティングシステムがすでにこの機能をサポートしていることを知っているので、この機能はあまりないようです不可能または不合理。
この機能の簡単な例は、逆参照された回数をカウントするポインターです。次のプログラムは、0 を出力し、次に 1 を出力します。
PS x が指す値が予期せず変更されるため、volatile 修飾子が必要です。同様に、x を逆参照するとカウンターが変更されるとコンパイラが考える理由がないので、そこにも volatile が必要ですか?