13


5

命令はデータとどのように区別されますか?

ARMコアドキュメントを読んでいると、この疑問に思いつきました。 CPUは、命令として実行するか、操作可能なデータとして実行するか、データバスからの読み取りデータをどのように区別しますか?

ドキュメントの抜粋を参照してください-

_ 「データはデータバスを介してプロセッサコアに入ります。 データは、実行する命令またはデータ項目である場合があります。」 _

私を啓発してくれてありがとう! /MS

6 Answer


9


簡単な答え-そうではありません。 マシンコード命令は、データと同様に単なる2進数です。 より複雑な答え-プロセッサはメモリのセグメンテーションを提供する場合としない場合があります。つまり、データとして指定されたものを実行しようとすると、何らかのトラップが発生します。 これは「セグメンテーションフォールト」の意味の1つです。プロセッサは、実行可能コードとしてラベル付けされていない何かを実行しようとしました。


5


各オペコードは、Nバイトの命令で構成され、後続のMバイトがデータ(メモリポインターなど)であると想定します。 したがって、CPUは各オペコードを使用して、次のバイトのうちどれがデータであるかを判断します。

確かに古いプロセッサ(例: 6502などのような古い8ビットタイプ)は区別されませんでした。 通常、プログラムカウンターはメモリ内のプログラムの先頭を指し、メモリ内の別の場所からデータを参照しますが、プログラム/データは単純な8ビット値として格納されていました。 プロセッサ自体はこの2つを区別できませんでした。

プログラムカウンターをデータと見なされたものに向けることは完全に可能であり、実際、教授がそれを「正確に」行った古い大学のチュートリアルを思い出し、彼に間違いを指摘しなければなりませんでした。 彼の応答は「しかしそれはデータだ! それは実行できません! それが可能かどうかを証明するために、有効なオペコードをデータに追加しました。


3


元のARMデザインには、命令を実行するための3段階のパイプラインがありました。

  1. CPUに命令をフェッチする

  2. CPUを実行用に構成する命令をデコードします

  3. 命令を実行します。

CPUの内部ロジックは、ステージ1でデータをフェッチしているかどうかを確認します(つまり、 命令フェッチ)、またはステージ3(つまり、 「ロード」命令によるデータフェッチ)。

最新のARMプロセッサには、命令をフェッチするための個別のバス(データのフェッチ中にパイプラインがストールしない)と、より長いパイプライン(より速いクロック速度を可能にする)がありますが、一般的な考え方は同じです。


2


プロセッサによる各読み取りは、データフェッチまたは命令フェッチとして知られています。 古いプロセッサと新しいプロセッサはすべて、データフェッチから命令フェッチを認識しています。 通常、ハーバードアーキテクチャプロセッサを除き、ARMがそうではないことを除いて、外部から伝えることができる場合とできない場合があります。 私は最近mpcore(ARM11)で作業してきましたが、外部インターフェースには、それがどんな種類の読み取りであるかを伝えるビットがあります。主に外部キャッシュを接続し、mmuがあるかどうかの知識と組み合わせますL1キャッシュがオンになり、命令からデータを取得できますが、それはルールの例外です。 メモリバスの観点からは、命令からのデータを知らないデータビットだけですが、そのメモリサイクルを開始し、結果を待っているロジックは、サイクルを開始する前に、それがどのようなフェッチで、何をするのかを知っていました取得時にそのデータを使用します。


0


私は、データがプログラムのどこに保存されているか、そしてそれがコードであるかデータであるかをCPUに知らせるためのOSサポートまで考えています。

すべてのコードは、変数のストレージと比較して、イメージの異なるセグメントに(定数文字列などの静的データとともに)配置されます。 OS(およびメモリ管理ユニット)はこれを知る必要があります。コードを破棄して元のディスクファイルからリロードするだけで、メモリからコードをスワップできるからです(少なくともWindowsの場合はそうです)。

ですから、CPUはメモリがデータなのかコードなのかを「知っている」と思います。 私たちが現在持っている現代のパイプ処理CPUには、CPUができるだけ速く処理するのを支援するためにこのメモリを異なる方法で読み取る命令もあります(たとえば、コードがキャッシュされない可能性があり、データはストリームではなく常にランダムにアクセスされます)

プログラムカウンターをデータに向けることは可能ですが、OSはこれを防ぐようCPUに指示できます-NXビットとWindowsの「データ実行保護」設定(システムコントロールパネル)を参照してください


-3


ですから、CPUはメモリがデータなのかコードなのかを「知っている」と思います。 私たちが現在持っている現代のパイプ処理CPUには、CPUができるだけ速く処理するのを支援するためにこのメモリを異なる方法で読み取る命令もあります(たとえば、コードがキャッシュされない可能性があり、データはストリームではなく常にランダムにアクセスされます)