問題タブ [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.
winapi - カーネル ドライバーの I/O インターフェイス機能の説明を探しています
32 ビット XP から 64 ビット Win7 以降まで、さまざまな Windows バージョンから特定のハードウェア I/O アドレスに接続する方法を検討しています。さまざまな Windows バージョンでさまざまな程度の機能を備えたさまざまなソリューションが公開されているようで、独自のカーネル ドライバーを作成する可能性を理解しようとしています。最も基本的なカーネル I/OR/W 機能は、READ_PORT_UCHAR や WRITE_PORT_UCHAR (およびそれらの word および long 派生語) などの直接 I/O 操作のようです。以下のテクニックも見ました私には理解できませんが、経験がなく、読み取り可能なドキュメントがほとんど見つからないメモリマッピング機能のようです。以下で再現するこのマッピング手法と READ_PORT_UCHAR / WRITE_PORT_UCHAR の適合性/互換性について誰かコメントしてもらえますか?
前もって感謝します。
windows - メモリ マップト ファイルの識別
VirtualQuery を使用して、プロセスの仮想メモリの一部を特定しています。マップされたファイル (MEM_MAPPED) によって取得された領域を識別しますが、そこに割り当てられたファイルの実際のファイル (ファイル名) を決定する方法は? MapView* ファミリの API と関係があると思いますが、正確にはわかりません...
java - Java で 2GB を超えるファイルをマッピングする
byte[] get(offset, length)
一般的に言えば、Java で 2GB を超えるメモリ マップト ファイルのメソッドをどのように実装しますか。
コンテキスト付き:
ランダム i/o で 2GB を超えるファイルを効率的に読み込もうとしています。もちろん、アイデアは Java nio とメモリマップ API を使用することです。
問題は、メモリ マッピングの 2GB の制限に伴います。解決策の 1 つは、2 GB の複数のページをマップし、オフセットを使用してインデックスを作成することです。
ここに同様の解決策があります:
Javaでソートされた(メモリマップされた?)ファイルでのバイナリ検索
このソリューションの問題は、API が読み取ることになっているときにバイトを読み取るように設計されていることですbyte[]
(したがって、API は のようなものになりますread(offset, length)
)。
get()
そのアルティメットをに変更するだけでうまくいくでしょうget(offset, length)
か?byte[]
i'm reading が 2 つのページの間にある場合はどうなりますか?
memory - vxWorks 6.8 物理メモリから仮想メモリへのマッピング
これは私の最初の質問です:)。
私はしばらくの間、vxWorks 6.8 で物理メモリを仮想メモリにマップしようとしましたが、成功しませんでした。「vmMap」関数を使用しようとしていますが、どういうわけか次のように返されます:
errno = 0x30065 S_taskLib_NAME_NOT_FOUND.
私のコードは次のとおりです。
どんな助けでも大歓迎です、ありがとう、
モシェ。
shared-memory - 共有メモリの物理アドレス空間を印刷する
Cプログラムでは、2つのプログラムを使用して、1つは共有メモリに文字列を格納し、もう1つは共有メモリにアクセスして同じ文字列を出力します。
c++ - 構造体をファイルにエクスポートしてから、ファイルをメモリマップする方法は?
ファイルにエクスポートしたい構造体があり、そのファイルをmmap()します。1つの問題は、構造体に文字列であるメンバー変数があり、mmapがそれをどのように処理するかわからないことです。この場合、これらの文字列はすべて同じサイズ、8文字です。Linuxのmmap()関数を複製することになっているオンラインで見つけたmmap()関数を使用していますが、私はWindowsで作業しています。
構造体自体は次のように定義されます。
オブジェクトのsizeof()の戻り値を定義することは可能ですか?
構造体データを含むファイルをmmappingすることは可能でしょうか?
構造体をファイルにエクスポートしてからmmapするには、どのコードを使用する必要がありますか?
memory - プロセッサがメモリマップドレジスタにアクセスするとき、実際にデバイスにアクセスしていますか?
デバイスに1つのレジスタがあり、CPUにx86のようなアーキテクチャがあるとします。このレジスタは、物理アドレス0x50000にメモリマップされています。
プロセッサは0X00ABCDEFを0x50000(物理)に書き込みます。RAMバンクを「開く」ことでそのアドレスを検査できた場合、何を見つける必要がありますか?0X00ABCDEFまたはジャンク?
デバイスのレジスタにはすでに0X00ABCDEFがあると思います。間違っていたら訂正してください。
c++ - 「メモリマップトファイルに存在するライブC++オブジェクト」?
そこで、GamasutraのJohn Carmackとのこのインタビューを読みました。彼は、彼が「メモリマップトファイルに存在するライブC++オブジェクト」と呼んでいるものについて語っています。ここにいくつかの引用があります:
JC:うん。そして、私は実際にそれから複数の利点を得る...最後のiOS Rageプロジェクトでは、いくつかの巧妙なものを使用して、フラッシュファイルシステムに裏打ちされたメモリマップファイルに存在するライブC++オブジェクトを作成するいくつかの新しいテクノロジーが付属しています。これが、PCでの今後のすべての作業を構成する方法です。
..。
ここでの私の行進命令は、PCプラットフォームで2秒のゲームロードが必要なので、それをはるかに高速に繰り返すことができます。そして現在、ソリッドステートドライブを使用している場合でも、読み込み時に行うすべてのことによって支配されているため、「すべてが間引きされ、相対アドレスで使用される」と言えるようになるには、この異なる分野が必要です。つまり、「ファイルをマッピングすると、すべてのリソースがすぐそこにあり、15ミリ秒で完了します」と言うだけです。
(完全なインタビューはここにあります)
カーマックが何について話しているのか、そしてあなたがこのようなものをどのように設定するのか、誰かが知っていますか?Webで少し検索しましたが、何も見つからないようです。
c - Windows および Linux でのメモリ ページ書き込み検出
私は現在、世代別ガベージコレクターに取り組んでいます。これは、最新のオブジェクトのみがトラバースされ、生き残ったオブジェクト (= 既知のルートから到達可能) が古い世代に昇格されることを意味します。オブジェクトが同じ世代または古い世代の他のオブジェクトを指している場合、これは問題なく機能します。ただし、古いオブジェクトが新しいオブジェクトを指している場合、新しいオブジェクトのみがトラバースされるため、ポイントされたオブジェクトが正しく収集されません。これを回避するために、そのようなオブジェクトは各 GC フェーズで明示的にマークされ、トラバースされます。
構造上、不変オブジェクトは常に既存のオブジェクトを指しているため、このような「親」オブジェクトは明らかに変更可能です。したがって、「親」になるには、昇格後にオブジェクトを変更して、新しいオブジェクトを指すようにする必要があります。
古い世代のどのオブジェクトが若い世代を指しているのかを知るために、メモリの変化を透過的に監視する方法を探しています。そのために、メモリ保護とシグナル/例外処理を使用します。メモリページは読み取り専用に設定されているため、書き込まれるたびにシグナル/例外が発生します。その場合、メモリ保護を読み取り/書き込みに戻し、さらに処理するためにアドレスをどこかに記録し、応答時に責任のあるコードを返します例外のため、正常に再開します。そうすれば、GC がトリガーされたときに、トラバースする可能性のある親を見つけるためにどこを見ればよいかがわかります。
Linux では、mprotect/SIGSEGV シグナル処理を組み合わせて使用します。Windows では、VirtualProtect を使用する予定ですが、SIGSEGV 処理に相当するものは見つかりませんでした。だから私の質問:
Windowsでそれをどのように行いますか?例外処理 API はかなり混乱しているようです。
この簿記をすべて行う必要がないように、どのメモリ領域が変更されるかを知るより良い方法はありますか?
私のコードはプレーンな C で書かれています。現在、変更されたオブジェクトを明示的にマークする呼び出し元コードが必要ですが、これは面倒でエラーが発生しやすいため、透過的な方法を探しています。
前もって感謝します、フレッド
c - ELF64 / x86_64およびメモリマッピングセグメントの開始アドレス(共有オブジェクトの場合)
私はいくつかのプログラムを作成しましたが、64ビットでコンパイルすると、メモリマッピングセグメント(たとえば、共有オブジェクトと共有メモリが保持される場所)は常に7f9aca84a000-7fff88400000付近にありますが、まったく同じになることはありません。
x86_64アーキテクチャ(ELF64)でこのメモリセグメントの開始アドレスが固定されているかどうか、またはこのセグメントの最大範囲と最小範囲はどれくらいか知りたいのですが。
これが私がこの質問をする理由です。システムをTru64UNIXからLinuxに移行しています。このシステムは、IPC Sys V共有メモリの複雑な固定メモリマッピングを使用し、チェーンリストを使用してこのセグメント内の構造から別の構造に移動しています。このコードのサイズと複雑さ、および手元にある限られた時間で、共有メモリの開始を修正する堅牢な方法を見つけようとしています(セグメントをアタッチするために指定されたアドレスでshmatを効果的に使用します) )。64ビットの仮想アドレス空間は非常に大きいため(48ビットの事実上可能なアドレス)、「安全な」固定アドレスの選択は32ビットよりもはるかに簡単でリスクが少なくなります。