2017-10-11 7 views
3

私は、Cの 'volatile'キーワードは、変数をRAMメモリからレジスタまたはキャッシュにロードしないように指示し、常にコンピュータのメモリから変数を読み込むように指示するのに使用されます。LinuxまたはWindowsを実行しているデスクトップコンピュータのCで「volatile」キーワードの使用を「テスト」する方法はありますか?

しかし、他のデバイスが変数に格納されているメモリアドレスの値を変更しているというケースもあります。

私の質問は次のとおりです。

は、プログラムは、LinuxまたはもMMUを持っており、(そのプログラムのための仮想アドレス空間を使用してWindowsマシン上で実行されている間、メモリアドレスの値を変更するためのあらゆる可能性がありますすべての現代のマシンのように)?

プログラムの変数を別のプログラム(別のスレッドだけでなく、別のプロセスで実行)から変更することはできますか?

答えて

0

ここにいくつか質問がありますので、最初に取り組みます。 "... volatileキーワードの使用をテストする..."

volatileキーワードを付けずにモジュールをアセンブラにコンパイルすることができます(私は-Sオプションだと思います)。この方法は、volatileキーワードで修正された同じコードに対して繰り返すことができ、diffツールはその変更に注目を集めることができます。問題の変数の読み込みにvolatileキーワードを使用すると、その変数の位置から常に直接的になると思われます。 これは、.mapリストを見て、volatile変数の実際の場所がどのようなものかを事前に知ることによっても確認できます。

4

プログラムがLinuxやWindowsマシンで実行されているときに、MMUを持ち、そのプログラムに仮想アドレス空間を使用する(現代のすべてのマシンなど)場合に、メモリアドレスの値を変更する可能性はありますか?

はい、もちろんです。

明らかな例はスレッディングです。あなたが見ているメモリを別のスレッドが更新している可能性があるので、決して変更しないと仮定したくありません。

他の例には、

  • 共有メモリ。プロセスは、効率的なIPCのためにメモリを共有することに同意することができます。
  • mmap。プログラムは、ファイルをメモリにマップすることができます。ファイルが変更されると、対応するメモリーも変更されます(Linuxでは、これが共有メモリーの基礎になります)。
  • DMA。ハードドライブのような他のデバイスは、効率的な転送のためにRAMに直接データを書き込むように求められます。

それは(別のプロセスだけでなく、別のスレッドで実行されている)別のプログラムからのプログラムの変数を変更することは可能ですか?

はい。プロセスが合意すれば、共有メモリを使用できます。

もしそうでなければ、デバッガとして別のメモリに接続し、メモリを検査/修正することができます。

関連する問題