• ベストアンサー

非キャッシュ領域へのキャッシュデータの上書き

こんにちは。どなたかご存知でしたら教えてください。 とあるCPUのキャッシュラインサイズが32バイトで、 非キャッシュアクセスするグローバル変数Aのアドレスがが32バイト境界上になく、 かつ、変数Aの直前の領域がキャッシュアクセスする領域の場合、 変数Aの先頭の領域がキャッシュの影響を受けて意図しないデータで つぶされる(上書きされる)可能性はあるのでしょうか? 非キャッシュアクセスするグローバル変数は必ずキャッシュラインサイズで境界調整する必要があるのでしょうか? 以上、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

そういえばSH系は同じ物理アドレスにキャッシュ空間と非キャッシュ空間がマップされてましたね。DMAとかCPU以外のものがアクセスする場合は使用前にキャッシュパージしてください。 変数としてのアクセスも単にキャッシュラインを分けるだけで足りるか自信ないです。むしろアクセスする非キャッシュ空間アドレスに対応するキャッシュ空間アドレスをキャッシュパージしておく方が良いと思います。

hanzo3
質問者

お礼

キャッシュパージですか。ネットで調べてみたらキャッシュを無効化する操作のようですね。使えるかどうか検討してみます。 ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

> キャッシュパージ キャッシュのフラッシュといったほうが用語として正しかったかも。 何にせよキャッシュとメモリの整合を取る命令です。 キャッシュが更新されていればメモリに書き出して、キャッシュのデータを無効にします。キャッシュライン単位でフラッシュできたと思います。

全文を見る
すると、全ての回答が全文表示されます。
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

どんなCPUとどんな言語を使って書いてるか分かりませんけど、普通はキャッシュされる変数と非キャッシュの変数を同じキャッシュラインに配置することなんてできないんじゃないですか? # 普通キャッシュ領域と非キャッシュ領域はページ単位でアラインされてるのでは? むしろどうやって同じキャッシュラインに乗るように配置するのか興味があります。

hanzo3
質問者

補足

コメントありがとうございます。 >どんなCPUとどんな言語を使って書いてるか分かりませんけど、 ルネサスのSH系のチップで、C言語で記述しています。 >普通キャッシュ領域と非キャッシュ領域はページ単位でアラインされてるのでは? 普通にグローバル領域を宣言してソフトウェアからアクセスして使用する分にはキャッシュアクセスなのですが、その領域をCPUのMMUを介さないでアクセスする場合(例えばDMAとか)は非キャッシュアクセスとなるようです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBAデータ型一覧表の「記憶領域のサイズ」とは

    エクセルVBAの変数宣言時に使うデータ型一覧内に「記憶領域のサイズ」というのがありますがどういう意味でしょうか。 例   種類    表記  記憶領域のサイズ  データ範囲    バイト型  Byte  1バイト      0~255 宣言と同時に、変数(箱)を確保する最大必要メモリーを意味するということなら、変数にデータ範囲の限度255を入れたとすると3文字なので1バイトでは足りないのでは? 初心者ですよろしくお願いします。

  • FAT16のデータ領域の開始位置について

    FAT16では、ディスク内に(1)FAT領域、(2)ディレクトリエントリ領域、(3)データ領域というそれぞれの領域を持つと聞いています。 さらに「データ領域」への書き込み処理は「クラスタサイズ(例えば、512バイト)」の単位で行われているそうですが、このデータ領域への書き込みに関して疑問点があります。 複数のファイルを書いた場合、それぞれのファイルに対応するデータ領域の先頭アドレスは必ずクラスタサイズの整数倍になるのでしょうか?質問を言い換えれば、データ領域の1つのクラスタ内に複数のファイルのデータが混在することはあるのでしょうか?

  • メモリ領域確保に関して

    C言語を始めて3ヶ月の初心者です。 下記のような定義で、領域確保をしたいのですが、 うまい方法がわかりません。 ご存知の方いらっしゃいましたら、 御知恵をお貸し下さいませんでしょうか? <test.h> ================================== #define SIZE_A (5) /* 親構造体 */ typedef struct { int testInt; testSmallStructT *testSmall; // 7バイト構造体の配列 char *testChar; // SIZE_A分の領域*配列数 } testBigStructT; /* 7バイト構造体 */ typedef struct { char str1[3]; char str2[4]; } testSmallStructT; /* メンバ変数 */ testBigStructT gTest[10]; ================================== ここで、あらかじめ全体の領域サイズを算出して、 mallocにてエリア確保を行う方法を求めてます。 また、多数にmallocを使用するとメモリ確保失敗時に、 それまで確保したエリアの開放を行わなくてはいけなくなる懸念から、 できるだけ使用しないようにしたいのです。 メンバ変数gTestを10の配列で持ち、構造体testBigStructTの、 要素testSmallとtestCharを可変の配列として扱いたくポインタ定義をしており、 更に、testCharにSIZE_A(5byte)の領域を確保しようとしております。 最終的には、下記のような使い方をしたいのですが、 メモリ確保の方法がわかりません。 =================================== (EX:) strcpy(gTest[0].testSmall[0].str1,"aaa"); strcpy(gTest[3].testSmall[2].str2,"bbb"); strcpy(gTest[6].testChar[3],"cccc"); =================================== 開放は下記の記述で問題ないと思っております。 free(gTest); 大変申し訳御座いませんが、 ご指摘・ご指導願いませんでしょうか? どうか宜しくお願い致します。

  • 表領域サイズについて

    現在Oracle10gにてDB構築しているのですが、表領域サイズについてよくわからないので詳しい方がいらしたら教えてください。 以下の3つのテーブルを同一表領域内に入れたいと考え、表サイズの合計サイズ分の表領域を確保してそこにテーブルを作成しようとしたときに領域が足りずにエラーが発生します。 テーブルA 604,800KB テーブルB 444,352KB テーブルC 725,760KB 合計サイズ:1,774,912KB→確保サイズ:1,740MB ブロックサイズ:16KB しょうがないので少しずつ拡張して入るように調整したところ「1,750MB」確保したところ無事に作成することができました。 Enterprise Managerコンソールで使用量を確認したところ「1,744.063MB」となっていました。 約10MBほど多く領域が取られているのですが、この現象についてご存知の方がいらっしゃいましたらご教授願えませんでしょうか。 ちなみに他の領域についても同様に計算どおりのサイズになっておらず、増えているサイズはマチマチです。 よろしくお願いいたします。

  • バッファオーバーフローで疑問があります。

    スタックのバッファオーバーフローで、バッファオーバーフローを起こすことで、変数領域の内容が上書きされ、さらにスタックのその他の領域(サブルーチンの戻りアドレスなど)までも書き換わってしまうとありますが、なぜそんなことが起きるのでしょうか? 私のイメージ的に、スタックの内容が以下のようだとして、 |          | | 変数領域(B) | |------------| | 変数領域(A) | |------------| | SFP       | |------------| | 戻りアドレス | |------------| | 関数の引数  | |------------| バッファオーバーフローが起きたとしても上書きされるのは 変数領域A,Bだと思ったのですが、スタックには最大領域でも決まっていてそれおも超えるデータ量の場合は、領域いっぱいまですべて上書くようにでもなっているのでしょうか? 気になって仕方がありません。 どうかよろしくお願いいたします。

  • 長方形の領域境界値問題

    長方形の領域0<=x<=a,0<=y<=bに関する境界値問題 d^2u/dx^2+d^2u/dy^2=0 x=0 du/dx=0 x=a, du/dx=sin(pi*y/b) y=0,u=0, y=b, u=0 変数分離法を用いてよい

  • スキャンデーターのサイズについて

    複合機からスキャンしてパソコンに取り込むとき、A3サイズの用紙のデーターがA4サイズで取り込まれてしまいます。サイズの調整方法を教えてください。 ユーザーズガイドで調べたのですが、環境設定画面で領域の調整をと出てくるのですが、その環境設定画面の出し方自体がよくわかりません。よろしくお願い致します。 ※OKWaveより補足:「EPSON社製品」についての質問です。

  • セカンドキャッシュによるCPUの性能差

    現在、CPUの乗せ換えを考えているのですが、 同じクロック数でキャッシュサイズが違うCPUは、どれくらいの性能差があるのでしょうか? 色々なHPをさまよっていたら以下の記載を見つけました。 記載された年やCPUの種類も違うの参考になるかわかりませんが・・・ >一般にキャッシュのサイズは1MBが限界といわれ, >1MB以上に容量を増やしても性能向上はほとんど期待できないといわれている. http://www.club6100.net/?FAQ%2FL2%A5%AD%A5%E3%A5%C3%A5%B7%A5%E5 以下のCPUで性能の違いを教えてください。 Core2Duo E6320 (1.86GHz,L2 4MB) Core2Duo E4300 (1.80GHz,L2 2MB) Pentium E2160 (1.80GHz,L2 1MB) Celeron 430 (1.80GHz,L2 512KB) よろしくお願いします。

  • HDD使用領域0バイト

    1年間使用していたHDDが、ディスク使用領域0バイトと表示され、中にあるファイルにアクセス使用としても一般のアクセスが拒否されましたとエラーメッセージがでます。 (マイコンピュータで合計サイズ、空き容量が表示されない) このHDDは外付けリムバーブル(USB2.0)で使用しています。他のHDDは正常動作しますので、箱の問題ではなさそうです。内箱も交換しましたが変化なしです。 誰か助けてください>-<

  • Android13のユーザーデータの位置

    お世話になります。 Android13以前に存在していた、 ゲームやアプリのキャッシュおよびユーザーデータの場所を探しています。 具体的には、 root/Android/配下に各アプリごとのアプリデータがあったはずなのですが、Android13になってからそこには何もありません。 しかし、アプリ情報のストレージとキャッシュという項目を見ると、 ユーザーデータやキャッシュはファイルサイズが存在しているので、 どこかしらには保存されているはずなのですが、 PCからでもいいのでツールなどご存じの方はおられないでしょうか。 消すのではなく、バックアップを取る、各ファイルにアクセスしたいという意図です。 よろしくお願いいたします。