2017-12-25 49 views
0

説明のアドレスを指定して、SWLW命令をMIPSで使用してコードセグメントメモリにアクセスできますか?例えばMIPSでSWとLWを使用してコードセグメントメモリにアクセスする

0x1000: ADDI $s1, $zero, 0x1000 
0x1004: LW $s2, 4($s1) 

$s2へのコードのロードをしませんか? 0x0000(データセグメントが空の場合)または命令のバイナリ表現0x1004

EDIT:

私の知る限り、MIPSプロセッサ内のパイプラインが原因命令メモリの分離とデータメモリに可能である - 私が間違っているなら、私を修正します。

EDIT 2:

私は命令がアクセスしLWSWを使用して変更することができることを意味するにquestion、答えを見つけました。したがって、答えは$s2に0x1004の命令のバイナリ表現が含まれます。

+0

MIPSには設定がありますか? –

+0

@old_timer:[実行可能ファイルのセグメント(data/text/bss)](https://stackoverflow.com/questions/14361248/whats-the-difference-of-section-and-segment-in-elf-file) -format)であり、セグメント化されたメモリモデルではありません。しかし、ええ、それはOPはプログラムセグメントとx86スタイルのセグメント化されたメモリ(MIPSは持っていない)について混乱しているようです。 –

+0

@old_timerはい、最初のGoogleの結果による:):https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Mips/dataseg.html –

答えて

1

アドレス0x1004に命令のマシンエンコーディングをロードします。

MIPSにはフラットメモリモデルがあります。異なるsegments of an executableは、単一のフラットメモリアドレス空間の異なる部分にマッピング/ロードされる。 it's a Von Neumann architectureここで、コードバイトと命令バイトは同じものであり、同じアドレス空間を共有します。

コードアドレスは、データアドレスと同じアドレス空間を使用します。マーティンの答えは、少なくともパーミッションが異なるMIPSを作成することが可能であることを示唆しています。もちろん、そのコードをROMに組み込んだMIPSはストアで命令を変更できませんでした。しかし、たとえコードアドレスへのストアに障害が発生しても、コードとデータを同じ物理アドレス空間の異なる部分にマップする必要があります。おそらく、あなたはMIPSを構築することができますが、どこのコードアドレスでもフォールトが発生しますが、それは起こりそうもありません。そのリージョン/ページの実行権限を無効にすると、データアドレスへのジャンプも失敗する可能性があります。

RAMに命令を持つ通常のMIPSの場合、書き込み+ execのアクセス権が設定されている場合はself-modifying code is possibleです。 (しかし、正確性のためにあなたは通常、そのQのコードが& AがやっていないIキャッシュをフラッシュする必要があることに注意してください。)、ASMソースで


そしてところで、.dataは本当に.dataを意味し、セクション、リンカは最終的に実行可能ファイルのセグメントにリンクします。 What's the difference of section and segment in ELF file formatを参照してください。

ここで最も重要なポイントは、実行可能ファイルのセグメントは、x86スタイルのセグメント化されたメモリと同じではありません。 (しかし、この用語の起源は同様です)。

+0

AFAIK、命令メモリとデータメモリの分離により、MIPSプロセッサのパイプライン化が可能です。 –

+0

@ArieR:あなたは間違っています。私が正しくリコールした場合、MIPSは実行しようとしている命令に格納した場合に何が起こるかを保証しません。古い命令または新しい命令が実行される可能性があります。格納されたデータを命令として表示したい場合は、実行する前にキャッシュなどをフラッシュする必要があります。 (ARMはこのように動作します:命令キャッシュとパイプラインはデータストアと一貫性がなく、isync命令などがあります)。ロードに関することだけを尋ねていたため、コードとデータとしての読み取り専用アクセスを共有していたため、私はこれについて言及しませんでした。 –

+0

しかし、x86にはコヒーレントなIキャッシュがあります。近代的なx86実装[スヌープはストアし、パイプラインをクリアして自己修正コードを検出する](https://stackoverflow.com/a/18388700/224132)ので、CPUをパイプライン化することも可能ですプログラムカウンタはコードフェッチするために可視でなければなりません。しかし、一貫したコードキャッシュ/パイプラインなしで、パイプライン化する方がずっと簡単です! (はい、それは問題ですが、解決策は「予測できない結果を望むなら、それをしないでください」と言うことです) –

0

は、あなたが「MIPS」で何を意味するかに依存します。あなたのような

  • 実際のMIPSのCPUは、いくつかのWLANルータでそれらを見つけますか?

  • SPIMやMARSのようなMIPSエミュレータはありますか?実際のMIPSのCPUの場合は

それはメモリ管理ユニットの構成方法によって異なります。

メモリ管理ユニットは、コード・セグメントへの読み取りアクセスを許可している場合、あなたが実際のバイナリ表現を取得しますアドレス0x1004の命令。

(ところで:あなたは 0よりも別の値が含まれている可能性が 0x1004 $s1ので $s1が本当に含まれていることを確認するために addi $s1, $0, 0x1004を使用する必要があります。)

をメモリ管理ユニットは、コード・セグメントプログラムへのアクセスを許可しない場合クラッシュするでしょう。 (ほとんどのMIPS CPUは、この設定を許可していないようです。)

あなたがSPIM、MARS(または任意の他の1)のようないくつかのエミュレータを使用する場合は、エミュレータが動作しているかに依存...

理論があるかもしれませんエミュレータの3種類:

  • いくつかのクラッシュ
  • いくつかの「愚かな」値
を読んでいるいくつかのバイナリ表現を読んでいるいくつかの
+0

MIPSは実際には実行(データ)の読み取り権を持たないメモリ領域/ページを設定することを許可していますか?コードフェッチがデータとは異なるアドレス空間を使用するかもしれないことを暗示していますか(「愚かな」値を読んでください)?私はバグのあるエミュレータを除いて命令語を読むこと以外に何が起こるのかはわかりません。 –

+0

ありがとうございました。私はそれを受け入れるだろう - しかし、私はここでデフォルトの動作が欠けている。現実世界のMIPS CPUで何がデフォルトとして期待されますか? –

+0

@ArieR:間違いなく、 "デフォルト"の期待は、アドレス0x1004の命令のマシンエンコーディングを得ることです。 MIPSにはフラットメモリモデルがあります。実行可能ファイルの異なるセグメントは、単一のフラットメモリアドレス空間の異なる部分にマッピング/ロードされます。コードバイトと命令バイトが同じものであるフォンノイマンのアーキテクチャです。そしてBTWでは、asmソースの '.data'は実際に' .data'セクションを意味し、リンカは最終的に実行可能ファイルのデータセグメントにリンクします。 –

関連する問題