問題タブ [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# - メモリにマップされたファイルへの書き込みを有効にする
ファイルが実際にインターネット上にあるときに、メモリ マップ ファイルを使用して、Windows でファイルを開くことを仮想化したいと考えています。
したがって、メモリマップファイルを次のように作成します。
そして、Windowsでそれを読み取ることはできますが、保存することはできません:
ファイルを開くことができた方法に注意してください(その間、データはハードディスクではなくメモリ上にありました)が、変更を保存しようとした瞬間、できませんでした。したがって、私の質問は次のとおりです。実際にディスクに何も保存しようとせずに、そのファイルへの変更の保存を有効にして、メモリマップされたファイルのメモリ内のコンテンツを変更するにはどうすればよいですか。
c - Linux でのメモリ マッピングの共有
動機
1 つのプログラムがデータを読み取って内部形式に転送し、もう 1 つのプログラムが内部形式を別のものに転送する、一対のプログラムを作成したいと考えています。演習として、パイプを使用せずにこれらのプログラム間の相互作用をコーディングしたいと思います。シグナルと共有メモリを使用するのが好きです。
私が欲しいもの
A が B を呼び出すプログラム A と B があります。
- プログラム A からメモリ ブロックを作成する
- プログラム A からプログラム B を呼び出し、メモリ ブロックの場所に関する情報を提供します。
- 両方のプログラムのメモリ ブロックを使用します。
より具体的には、A はカスタム ビデオ形式をデコードし、1 つの非圧縮フレームを共有バッファーに配置します。B はバッファから読み取り、それを出力ストリームにエンコードします。デコーダーは、約 500 MiB/秒のメモリ トラフィックである、1 秒あたり最大 100 フレームをデコードします。データを頻繁にコピーする必要があり、バッファが正確に大きくないため、パイプは遅いことが判明しました。
うまくいくと思うこと
私の考えはmmap(NULL,len,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,-1,0)
、共有メモリのセクションを作成するために使用することです。問題は、次のexecve(2)
状態のマンページです。
メモリ マッピングは保持されません (mmap(2))。
では、そのメモリを他のプログラムと共有するにはどうすればよいでしょうか。両方の機能を 1 つのプログラムに入れ、fork
代わりに使用する方が良いでしょうか?
linux - Linux 2.6.30 DMA API のデバイス メモリのマッピング
私はこれに苦労してきました。本当に助けていただければ幸いです。At91sam9g45 の内部 SRAM (足がかり - 起動後は使用されません) を使用して、集中的な計算を高速化したいのですが、次のすべての条件を満たしていません。
メモリはユーザー空間からアクセスできます。これは、ユーザー空間を使用して
mmap()
からカーネルを使用すると簡単でしremap_pfn_range()
た。返されたポインターを使用して、ユーザー空間プログラムは SRAM の読み取り/書き込みを行うことができます。カーネル DMA API 呼び出し
dma_async_memcpy_buf_to_buf()
を使用して、DMA を使用して memcpy を実行します。私の基本的なドライバー内で、この操作を呼び出して、データを DDR ( kmalloc() で割り当てられた) から SRAM バッファーにコピーしたいと考えています。
したがって、私の問題は、ユーザー空間と物理アドレスがありますが、カーネル空間の DMA API に適したマッピングがないことです。
ioremap を使用して、に提供された固定仮想アドレスを使用してみましたiotable_init()
。これらのいずれも、次のようなもので使用できるカーネル仮想アドレスにはならないようですvirt_to_bus
(これはkmallocアドレスで機能し、DMA API内で使用されていると思います)。
方法はありますが、物理アドレスを使用して DMA を手動でトリガーするだけですが、これを試して理解したいと思います。私はLDD3とグーグルを読んでいますが、DMA API(PCIバスを除く)にkmalloc以外のメモリを使用する例は見当たりません。
windows - ミニフィルター ドライバー、メモリ マップ、およびメモ帳
最終目標から始めます。システム上のすべてのドキュメント (doc、docx、pdf、txt など) に、固定された (そしてユーザーに透過的な) ヘッダーが必要です。たとえば、文字列「abcde」がすべてのドキュメントの先頭に追加されます。
そのために、次のことを行うミニフィルター ドライバーを作成しました。
IRP_MJ_WRITE
- ヘッダーが存在する場合は、オフセットをファイルの先頭に変更します。
IRP_MJ_READ
- ヘッダーが存在する場合は、オフセットをファイルの先頭に変更します。
IRP_MJ_QUERY_INFORMATION
- ヘッダーが存在する場合は、返されるファイルのサイズを変更します。
IRP_MJ_DIRECTORY_CONTROL
- ヘッダーが存在する場合は、返されるファイルのサイズを変更します。
IRP_MJ_CREATE
- ヘッダーが存在しない場合は、ヘッダーをファイルに追加します。
これは、MS Word 2003 ドキュメント (doc、xls、ppt) とメモ帳を除いて、うまく機能します。読み取りおよび書き込み操作の一部をキャッチしていないようで、メモ帳にはファイルだけでなくヘッダーも表示されます。
私はhttp://www.osronline.com/でたくさん読んだことがありますが、そこに尋ねる人は誰でも、Nagar の本を読むか、アーカイブを見るように言われます (検索するのは大変です)。私の問題に関連するすべてを読んだと思います。
メモ帳はメモリ マップ ファイル、Fast IO、Pagged IO を使用しているようです。mHook を使用してフックしようとしましたが、メモ帳でファイルを開いてマップされたデータを見つけようとしたときに、運がありませんでした (ただし、メモリにマップされた他のすべてのバイトが見つかりましNtMapViewOfSection
た) MapViewOfFile
。MapViewOfFileEx
次に、達成しようとしていることはフックでは不可能であり、ミニフィルタードライバーでのみ可能であり、設定するフラグがいくつか不足していると考えたことを読みました。
メモ帳の操作をキャッチするために何をすべきかを誰かが教えてくれたら、本当に感謝します。
読み取りのコード例を次に示します。
IsFileNeedProccessing
ファイル名と要求プロセスをチェックします。(一部のアプリではヘッダーが表示されます)
メモ帳の操作をキャッチするために何をすべきかを誰かが教えてくれたら、本当に感謝します。
ありがとう。
c++ - メモリマップされたデータブロックを構造体に読み込む
私は今日VC++2008でメモリマッピングをいじっていますが、それを使用する方法や、それが私の目的に合っているかどうかをまだ完全には理解していません。ここでの私の目標は、非常に大きなバイナリファイルをすばやく読み取ることです。
私は構造体を持っています:
これは何度もファイルに書き込まれます。「entries」変数は、浮動小数点の小数の配列です。このファイルを書き込んだ後(各「エントリ」配列が90000フロートである10000データ構造体)、データをより速く読み取ることができるように、次の関数を使用してこのファイルをメモリマップしようとしました。これが私がこれまでに持っているものです:
関数の最後で、メモリがマップされ、メモリブロック「pBuf」の先頭へのポインタが返された後、このメモリブロックをデータに読み戻すにはどうすればよいかわかりません。構造。したがって、最終的には、このメモリブロックを10000データ構造体エントリの配列に戻したいと思います。もちろん、私はこれを完全に間違っている可能性があります...
java - Java のメモリ マップ コレクション
JVM ヒープ領域をいっぱいにしています。
パラメーターを変更して JVM により多くのヒープ スペースを与えるか、コード内のアルゴリズムの何かを変更してあまり多くのスペースを使用しないようにすることは、最も推奨される 2 つのオプションです。
しかし、これらの 2 つが既に試行されて適用されていて、それでもメモリ不足の例外が発生する場合は、他のオプションが何であるかを確認したいと思います。
この「巨大な行列にメモリマップファイルを使用する」という例と、私の問題を解決する興味深い方法であるHugeCollectionsというライブラリについて知りました。残念ながら、このライブラリは 1 年以上更新されておらず、どの Maven リポジトリにもありません。そのため、私にとっては本当に信頼できるものではありません。
私の質問は、これを行う他のライブラリ、またはそれを達成する良い方法 (コレクション オブジェクト (リストとセット) のメモリをマップすること) はありますか?
c++ - ostream でメモリ マップを出力してからコアをダンプする
優先キューを実装しようとしているプログラムがあります。PriorityQueue.h ファイルで ostream 演算子 << をオーバーロードしましたが、その関数が呼び出されると、キューから正しい値を出力した後、メモリ マップが出力され、コアがダンプされてプログラムが終了します。
これは、キューの内容を出力するための呼び出しです (この行は main.cpp ファイルにあります)。
ここで、Q1 はプライオリティ キューで、値 10、5、1 がこの順序で含まれています。
これが私の PriorityQueue.h ファイルです。一番下は、オーバーロードされた ostream 演算子を定義した場所です。
編集:
これがプログラムの出力です
process - Linux のプロセスのメモリ マップ
実行可能ファイルを取得するために組み立ててリンクした次のコードがあります。
hello: .ascii "Hello World" .text
.global _start
_start: movl $4,%eax movl $1,%ebx movl $hello,%ecx movl $11,%edx int $0x80
学習プロセスとして、プロセスのメモリ マップ (上記の実行可能ファイルによる) を見たいと思います。pmap と cat /proc/PID/maps の両方にプロセス ID が必要です。gcc でコンパイルされた C プログラムの場合、gdb を使用してブレークポイントを設定し、別の端末で pid を取得できます。
上記の場合、実行可能ファイルに利用可能なデバッガー シンボル テーブルがないため、ブレークポイントを設定できません。pid を使用せずにプロセスのメモリ構造を確認する方法はありますか? 実行可能ファイルをロードしてメモリ構造をダンプするある種のプログラムを意味します。
助けてくれてありがとう。
c# - MMFからSQLiteデータベースにアクセスします
私はSystem.Data.SQLite
libを使用してSQLiteデータベースにアクセスしています。dbファイルをメモリにロードし、MMF(メモリマップトファイル)を使用してデータベースにアクセスしたいと思います。
これはデフォルトのSQLiteライブラリを使用して可能ですか?
編集:
インメモリデータベースを作成する方法の代替案を歓迎します。
linux - Linux - カーネル コードでのユーザー空間メモリのマッピング
SOC がシャットダウンする前に、特定の物理アドレスにある 10k のメモリを保存する必要があるコードを書いています。
私の問題は、この物理アドレスがカーネル空間の一部ではないため、このメモリ空間にアクセスできるようにアドホック メモリ マッピングを作成する必要があることです。
io-remap を使用してみましたが、(明らかに) 非カーネル空間では機能しません。
これを行うための API はありますか? kmap を使用する必要がありますか?
前もって感謝します