問題タブ [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.

0 投票する
1 に答える
1984 参照

c# - MemoryMappedFile またはシリアル化、非常に大きなオブジェクトの速度

次のようなディクショナリに格納された、かなり複雑なネストされた (参照オブジェクトを上下に呼び出す参照) オブジェクト (クラス) を持つプロジェクトがあります。

Object1 は複雑なクラスです。「住所録」や「人物情報」クラスとは違います。クラス自体には、配列、別のオブジェクトの辞書があります。これらのオブジェクトは、その上のクラスを参照します。

DObject のサイズはメモリ内で 1GB 以上になる可能性があるため、BinaryFormatter を使用してファイルにシリアル化します。このオブジェクトをロードする必要があるため、MemoryMappedFile を使用することを考えていました。新しいキーと値がディクショナリに追加される場合があります。オブジェクトには、より多くのデータ (追加/更新) などが含まれている可能性があります。MMF のサイズは変わりますか? メモリ マップ ファイルの DObject の特定のキーにアクセスするにはどうすればよいですか? メモリ内にハッシュテーブルのような検索メカニズムがあり、辞書のような特定のキーを見つけてその値を取得できますか? とにかく、このMMFはどのように機能しますか?

私の理想の考えは。ディスクに大きなファイルがあります (2GB 以上)。ディスクにメモリを保存するように、ディクショナリ内のオブジェクトをディスク上で高速に更新します。すべてが高速です。Key-Value ルックアップ。検索、値の編集、保存など...いつでもこの2GB以上のオブジェクトにすばやくアクセスする必要があります。WCF サーバーが再起動したら、この 2 GB 以上のサイズのオブジェクトにすばやくアクセスする必要があります。だから1)連載2)を考えていたわけです。MMF との間でロードおよび読み取りを行います。現時点での私の主な関心事は速度です。つまり、プロジェクトをデバッグするたびに、この 2GB のデータをゼロから再ロードすることはできません (時間がかかります)。

この状況をどのように処理すべきかについての提案、アイデア、および考え。

0 投票する
2 に答える
2627 参照

osdev - メモリマップドI/Oアドレスはどこから来ますか?

私はいくつかの愛好家のOS開発をいじっていて、メモリマップドI/Oアドレスについて少し混乱しています。メモリマップドI/Oの概念全体を理解していますが、開発者がハードウェアを操作するためのアドレスを取得する方法を理解しようとしています。

アドレスはハードウェアベンダーによって指定されていますか、それともすべてのコンピューターの標準アドレスのようなものですか?たとえば、テキスト印刷用のVGAメモリはアドレス0xB8000から始まります。これはすべてのx86マシンの標準ですか?もしそうなら、誰がその基準を設定しましたか?たとえば、イーサネットカードと通信したい場合、通信に使用するアドレスまたはポートをどのように知ることができますか?

前もって感謝します。

0 投票する
1 に答える
2795 参照

c - 32ビットLinuxカーネルで1GB(またはそれ以上)の物理メモリをマッピングする方法

2GBのメモリを使用するセットアップがあり、1GB(またはそれ以上)の物理メモリをユーザースペースの仮想アドレスにマッピングしたいと思います。32ビットのセットアップでは、ユーザーの土地アプリで3GBの仮想アドレスを使用できるため、理論的には可能です。

カーネルのコマンドラインを次のパラメーターで更新しました。カーネルmem=1G memmap=1G$1G に1GBのRAMを認識させ、最後の1GBを予約します。

ユーザースペースのmmap()呼び出しを処理し、関数を使用して物理アドレス0x40000000(1G)をユーザースペースアドレスにマップするカスタムドライバーがありますremap_pfn_range()

ただし、この関数はでカーネルBUG()をトリガーしますremap_pte_range()。同じ呼び出しが、1GBではなく300MBのリマップで機能していました。

私は通常、ioremap()物理アドレスをカーネル仮想アドレスにマップするためにドライバーを呼び出していました。この場合、1G / 3G仮想アドレスが分割されているためできません(カーネルの場合は1G、アプリの場合は3G)。だから私は、カーネルでこれらの物理アドレスをマッピングせずに、物理アドレスをユーザースペースの仮想アドレスにマッピングすることが可能かどうか疑問に思いましたか?

これは32ビットのx86カーネル、つまり「i386」アーキテクチャです。

0 投票する
2 に答える
1443 参照

memory - ディスクの読み取り/書き込みのオーバーヘッドをどのように削減しますか?

主にJavaScriptで構成されたWebサイトが1つあります。IISでホストしました。このWebサイトは、ハードディスク上の特定のフォルダーからの画像を要求し、それらをエンドユーザーに表示します。画像のリクエストは非常に頻繁で高速です。

このディスク読み取り操作のオーバーヘッドを減らす方法はありますか?

ハードディスクの一部をマッピングしてプライマリメモリとして使用するメモリマッピングについて聞いたことがあります。誰かが私が間違っているか正しいかを教えてもらえますか、私が正しい場合、これを行うための手順は何ですか。私が間違っている場合、これに対する他の解決策はありますか?

0 投票する
1 に答える
975 参照

c++ - Windows CreateFileMapping : 同じバッキング ファイルを持つ異なるファイル マッピング オブジェクト

ファイル マッピングを使用して 2 つのプロセス間でコンテンツを共有できることはわかっていますが、これには同じファイル マッピング オブジェクトが必要です。

各プロセスが独自のファイル ハンドルを持つ独自のファイル マッピング オブジェクトを作成するが、各ファイル ハンドルが同じファイルを指している場合はどうなるでしょうか。

ありがとうチャン

0 投票する
3 に答える
3123 参照

c# - メモリ マップト ファイルから int を取得する方法

スペースで区切られた数字のファイルがあります。サイズは約1Gbで、そこから数値を取得したいと思います。高速に読み取るためにメモリ マップ ファイルを使用することにしましたが、その方法がわかりません。私は次にやろうとしました:

しかし、「test」の num[0] に「01」だけが含まれている場合、12337 が得られます。12337 = 48*256+49 です。インターネットで検索しましたが、私の質問について何も見つかりませんでした。バイト配列またはプロセス間通信についてのみ。num[0] で 1 を取得する方法を教えてもらえますか?

0 投票する
0 に答える
793 参照

c# - MemoryMappedViewAccessor を使用してメモリ マップト ファイルに書き込みますか?

メモリ マップト ファイルにデータを書き込みたい。実際には、変更後にディスクに保存したいと考えています。出来ますか?インターネットを検索しましたが、Write() を呼び出すと、この MMF を使用する他のプロセスに変更が表示されることがわかりました。それを保存する方法は?

私は使っている

ただし、ディスク上のファイルは変更されません。

0 投票する
0 に答える
2567 参照

c# - メモリマップトファイルを削除する方法は?

メモリマップトファイルを使用していますが、作業が終了したら、ディスクからファイルを削除したいと思います。しかし、File.Delete(fileName);にUnauthorizedAccessExceptionがあります。ここで「using」を使用する必要があることを読みましたが、複数のファイルを処理するため、MemoryMappedFileAccessorの配列があります。私のコード:

File.Delete();で例外が発生します。どうすればファイルを解放できますか?

0 投票する
2 に答える
754 参照

c - Linux での単体テスト用にメモリ I/O デバイスをエミュレートするにはどうすればよいですか?

Linux での単体テスト用にメモリ I/O デバイスをエミュレートするにはどうすればよいですか?

組み込み展開用のソースコードの単体テストを書いています。

コードは、チップと通信するために特定のアドレス空間にアクセスしています。

  • このコードを Linux で単体テスト (UT) したいと考えています。
  • 単体テストは、人間の介入なしで実行できる必要があります。
  • UT を通常のユーザーとして実行する必要があります。
  • テストするコードは、ターゲット システムで実行されているソース コードとまったく同じでなければなりません。

これを解決する方法についてインスピレーションを得るためにどこに行くことができるかについてのアイデアはありますか?

通常のユーザーは、特定のメモリ割り当てを特定のアドレスで行う必要があることを MMU に伝えることができますか。それとも、データ ブロックが特定のメモリ領域にある必要がありますか?

私が理解しているように:

  • sigsegv は使用できません。ハンドラーから戻った後、同じメモリアクセスコードが再度呼び出され、再び失敗するためです。(または偶然、メモリ領域に実際に有効なデータが含まれている可能性がありますが、私が望むものではありません)

    ありがとう

    ヘンリー

0 投票する
1 に答える
1463 参照

c - Cortex-M3でプレキャストアドレスを使用してビットバンディングマクロを使用する場合のキャストの問題

TL; DR:

  1. なぜと(unsigned long)(0x400253FC)同等ではないの(unsigned long)((*((volatile unsigned long *)0x400253FC)))ですか?
  2. 前者で動作するマクロを後者で動作させるにはどうすればよいですか?

背景情報

環境

私は、ARM Cortex-M3プロセッサであるTIのLM3S6965と、 StellarisWare(無料ダウンロード、輸出管理)の定義を使用しています。gccバージョン4.6.1(Sourcery CodeBench Lite 2011.09-69)を使用しています。Stellarisは、「inc / lm3s6965.h」で約5,000個のレジスタとメモリアドレスの定義を提供していますが、これらすべてをやり直したくはありません。しかし、私が書きたいマクロとは互換性がないようです。

ビットバンディング

ARM Cortex-M3では、メモリの一部が、ペリフェラルおよびRAMメモリスペースのビットごとに1つの32ビットワードでエイリアスされます。アドレス0x42000000のメモリを0x00000001に設定すると、アドレス0x40000000のメモリの最初のビットが1に設定されますが、ワードの残りの部分には影響しません。ビット2を変更するには、0x42000004の単語を1に変更します。これは優れた機能であり、非常に便利です。ARMテクニカルリファレンスマニュアルによると、アドレスを計算するためのアルゴリズムは次のとおりです。

どこ:

  • bit_word_offsetは、ビットバンドメモリ領域内のターゲットビットの位置です。
  • bit_word_addrは、ターゲットビットにマップされるエイリアスメモリ領域内のワードのアドレスです。
  • bit_band_baseエイリアス領域の開始アドレスです。
  • byte_offsetは、ターゲットビットを含むビットバンド領域のバイト数です。
  • bit_numberターゲットビットの0〜7のビット位置です

ビットバンディングの実装

この"inc/hw_types.h"ファイルには、このアルゴリズムを実装する次のマクロが含まれています。明確にするために、4バイトに整列されたワードと0〜31ビットのオフセットを受け入れるワードベースのモデルに実装されていますが、結果のアドレスは同等です。

このアルゴリズムは、0x20000000のSRAMまたは0x40000000のペリフェラルメモリスペースのいずれかにあるベースを取得し、それを0x02000000とOR演算して、ビットバンドベースオフセットを追加します。次に、ベースからのオフセットを32倍し(5ポジションの左シフトに相当)、ビット番号を加算します。

参照されるHWREGは、メモリ内の特定の場所に書き込むために必要なキャストを実行するだけです。

これは、次のような割り当てで非常にうまく機能します

ここで、0x400253FCはメモリマップドペリフェラルのマジックナンバーであり、このペリフェラルのビット0を1に設定したいと思います。上記のコードは(もちろんコンパイル時に)ビットオフセットを計算し、そのワードを1に設定します。

動作しないもの

残念ながら、「inc / lm3s6965.h」の前述の定義は、HWREGによって行われたキャストをすでに実行しています。マジックナンバーを避け、代わりに次のような提供された定義を使用したい

これをHWREGBITWに貼り付けようとすると、キャストが干渉するため、マクロが機能しなくなります。

プリプロセッサは、次の混乱を生成します(インデントが追加されました)。

の2つのインスタンスに注意してください

これらの余分なキャストが私のプロセスの失敗の原因であると私は信じています。次の前処理の結果はHWREGBITW(0x400253FC, 0) = 1;機能し、私の主張を裏付けています。

(type)キャスト演算子は右から左に優先されるため、最後のキャストが適用さunsigned longれ、ビット単位の演算に使用されます(これは正しく機能するはずです)。どこにも暗黙的なものはなく、floatからポインタへの変換、精度/範囲の変更はありません...左端のキャストは、右へのキャストを単に無効にする必要があります。

私の質問(ついに...)

  1. なぜと(unsigned long)(0x400253FC)同等ではないの(unsigned long)((*((volatile unsigned long *)0x400253FC)))ですか?
  2. HWREGBITW既存のマクロを機能させるにはどうすればよいですか?または、同じタスクを実行するが、既存のキャストで引数が与えられたときに失敗しないようにマクロを作成するにはどうすればよいですか?