プログラム動作中にメモリの全領域をベリファイチェックをしたいと思っています。

ベリファイチェックを行うプログラムが動作する時には、他のタスクが動作することはないのでベリファイする部分を一時退避して、チェック後に元に戻すと言うことを考えています。
しかし、ベリファイチェックを行うプログラム自身が使用する領域も当然チェック対象となってしまいます。
アセンブラで記述するのであれば、何とか書ける気がするのですが、C言語で記述することは可能でしょうか?
上記のようなメモリ診断手法を解説しているページなどあればお教えください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:Kumappus No.1

回答回数3784ベストアンサー獲得回数185

ポイント45pt

回答が付かないようなので。ポイントは不要です。

まず、対象としているシステムを明らかにされるほうがよいと思います。

例えばPCなのか、組み込みの機器なのか。

OS上で走るのか、だとすると他のアプリが動いている状態で平行して走らせる必要があるのか、あるいはOS起動時に強制的に処理を横取りして走るのかなど…。

仮に対象が”PC”であれば、メモリ全体をアクセスするためにはx86系のメモリモデルを理解する必要があります。MMUの設定やページの切り替えなどはC言語だけではちょっと厳しいですね。

http://www.memtest86.com/

Memtest86 - Memory Diagnostic Page

実際にはこういうように、OSも起動しないでテストプログラムを起動時に実行するやり方を取るようです。

id:maq

ありがとうございます。

対象システムはOSは搭載されていない組み込み機器です。

2005/06/03 23:39:00
id:terra5 No.2

回答回数57ベストアンサー獲得回数0

ポイント45pt

http://www.nifty.com/webapp/digitalword/word/005/00533.htm

@nifty:デジタル用語辞典:仮想メモリ

まずWindows,LinuxといったOSの場合は通常仮想記憶、仮想メモリをつかっており、

通常のプログラムは通常の手段物理的なアドレスでメモリアクセスにアクセスすらできません。

具体的な方法はOSなどによりますし、少なくても特権ユーザー、アドミニストレイター等の権限が必要です。

http://www.nifty.com/webapp/digitalword/word/011/01116.htm

@nifty:デジタル用語辞典:マルチタスク

Pentium4のようなHTがあったり、デュアルコアのCPUだったり、マルチCPUなら同時に二つ以上動きます。

またシングルであっても、タスクスイッチはOSによってはいつ起きるか分りませんから、メモリの待避途中にタスクが切り替わる可能性があります。

OSによってはいろいろな手段で禁止したり起きないように配慮することも可能な場合がありますが、当然OSにより異なります。

http://www.nifty.com/webapp/digitalword/word/005/00562.htm

@nifty:デジタル用語辞典:割り込みハンドラ

また、通常はタスクよりも優先されて割り込み処理が動きます。

これも割り込みを禁止することでとめられますが、具体的にはOSによりますしそもそも可能かどうかという話もあると思います。

まあ通常のOS動作中に行うのはまず無理と考えた方がいいと思います。

おそらくオーバーヘッドも半端じゃないでしょうし、レスポンスがかなり悪化するでしょう。

id:maq

OSは載っていない組み込み機器です…。

2005/06/04 01:01:28
  • id:Kumappus
    ちょっと意図がわかりませんね

    組み込み用で、機器の動作中にメモリチェックプログラムを走らせる意図がよくわかりません。
    何か負荷をかけた状態でメモリを調べる必要があるのでしょうか。また、それでメモリに異常が見つかった場合、どういう対処をするのでしょうか。さらにこのチェックの重要性は?
    そういう要件をクリアにしていくと、OSを持たない組み込み用ということですのでもっといろいろな実装方法が考えられるはずです。
    極端な話、モニタROMに入れてしまえば、そこは評価対象から外していいはずなので自身を退避(まあもしやるとしたらposition independentなコードを書いておいてメモリ上を移動でしょうが)する必要もないですよね。
  • id:Kityo
    Re:ちょっと意図がわかりませんね

    >組み込み用で、機器の動作中にメモリチェックプログラムを走らせる意図がよくわかりません。
     ノイズとか温度とか非常に汚れた条件で稼動する機器では、動作中の全領域のメモリチェック(常時!)を要望される顧客もあります。
     機械語がRAMにある場合でさえ、その機械語のRAMも含めたチェックを要望される場合も。そのな場合は、機械語のROMにもSUMか何かつけておいて常時チェックの対象になったりします。

     実際にそこまで神経質にチェックしても信頼の於けるチェック結果をアウトプット出来るかさえ疑問なのが1技術者の見解ではありますが、「仕様」なので逆らえなかったりします。
     しかもあなた、チェック結果NGをメモリカードに記録せよと言う「仕様」まであったりする(笑)
  • id:Kumappus
    Re(2):ちょっと意図がわかりませんね

    > ノイズとか温度とか非常に汚れた条件で稼動する機器では、動作中の全領域のメモリチェック(常時!)を要望される顧客もあります。
    (苦笑)
    GCCだとposition independent codeが吐けるようですが、これはダイナミックリンカー・ローダーの助けを前提としてるみたいですし、コードが機種依存だからなあ。
    Cでの値の渡し方を解析して、部分的にはアセンブラを使うのが現実的かもしれません。
    すみません、あまりお役に立てなくて…。
  • id:Kityo
    Re(3):ちょっと意図がわかりませんね

    >すみません、あまりお役に立てなくて…。
     いえ、僕質問者さんではないですので、お役に立つも何も、です。

     更に苦笑ネタを追加。
     しかも「可能な限りC言語で記述」と言う仕様。
     書けますよ、移植性と可読性とが限りなく低下しますけれど。

この質問への反応(ブックマークコメント)

トラックバック

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません