ARMコアドキュメントを読んでいるときに、私はこの疑問を抱きました。CPUは、読み取ったデータをデータバスからどのように区別しますか。それを命令として実行するか、操作可能なデータとして実行するかは関係ありません。
ドキュメントからの抜粋を参照してください-
「データはデータバスを介してプロセッサコアに入ります。データは実行する命令またはデータ項目である可能性があります。」
教えてくれてありがとう!/MS
ARMコアドキュメントを読んでいるときに、私はこの疑問を抱きました。CPUは、読み取ったデータをデータバスからどのように区別しますか。それを命令として実行するか、操作可能なデータとして実行するかは関係ありません。
ドキュメントからの抜粋を参照してください-
「データはデータバスを介してプロセッサコアに入ります。データは実行する命令またはデータ項目である可能性があります。」
教えてくれてありがとう!/MS
簡単な答え-そうではありません。マシンコード命令は、データと同様に単なる2進数です。より複雑な答え-プロセッサがメモリのセグメンテーションを提供する場合と提供しない場合があります。つまり、データとして指定されたものを実行しようとすると、ある種のトラップが発生します。これは、「セグメンテーション違反」の意味の1つです。プロセッサは、実行可能コードとしてラベル付けされていないものを実行しようとしました。
各オペコードはNバイトの命令で構成され、後続のMバイトがデータ(メモリポインタなど)であると想定されます。したがって、CPUは各オペコードを使用して、次のバイトのうちデータであるバイト数を判別します。
確かに、古いプロセッサ(たとえば、6502などの古い8ビットタイプ)では、区別はありませんでした。通常、プログラムカウンターはメモリ内のプログラムの先頭を指し、メモリ内の別の場所からのデータを参照しますが、プログラム/データは単純な8ビット値として格納されていました。プロセッサ自体は、2つを区別できませんでした。
プログラムカウンターをデータと見なしたものに向けることは完全に可能でした。実際、私の教授がまさにそれを行った古い大学のチュートリアルを覚えています。私たちは彼に間違いを指摘しなければなりませんでした。彼の応答は「しかし、それはデータです!それは実行できません!それはできますか?」でした。その時点で、私はデータに有効なオペコードを入力して、実際に実行できることを証明しました。
元のARM設計には、命令を実行するための3段階のパイプラインがありました。
CPUの内部ロジックは、ステージ1(つまり、命令フェッチ)でデータをフェッチしているのか、ステージ3(つまり、「ロード」命令によるデータフェッチ)でデータをフェッチしているのかを確実に認識します。
最新のARMプロセッサには、命令をフェッチするための個別のバス(データのフェッチ中にパイプラインが停止しないようにするため)と、より長いパイプライン(より高速なクロック速度を可能にするため)がありますが、一般的な考え方は同じです。
プロセッサによって読み取られる各読み取りは、データフェッチまたは命令フェッチであることが知られています。新旧のすべてのプロセッサは、データフェッチからの命令フェッチを認識しています。もちろん、ARMがそうではないハーバードアーキテクチャプロセッサを除いて、外部からはわかる場合とできない場合があります。私は最近mpcore(ARM11)を使用していますが、外部インターフェイスには、読み取りの種類について少し説明するビットがあります。主に外部キャッシュを接続し、それをmmuがあるかどうかの知識と組み合わせます。 L1がキャッシュされ、命令からデータを区別できますが、これはルールの例外です。メモリバスの観点からは、命令からのデータを知らないのは単なるデータビットです。
それは、データがプログラムのどこに保存されているか、そしてそれがコードであるかデータであるかをCPUに通知するためのOSサポートにかかっていると思います。
すべてのコードは、変数のストレージと比較して、画像の異なるセグメントに(定数文字列などの静的データとともに)配置されます。OS(およびメモリ管理ユニット)は、コードを破棄して元のディスクファイルからリロードするだけでコードをメモリからスワップできるため、これを知る必要があります(少なくともWindowsの方法です)。
したがって、CPUはメモリがデータであるかコードであるかを「認識」していると思います。間違いなく、最新のパイピングCPUには、CPUが可能な限り高速に処理するのを支援するために、このメモリを別の方法で読み取るための命令もあります(たとえば、コードはキャッシュされない場合があり、データはストリームではなく常にランダムにアクセスされます)
プログラムカウンターをデータに向けることは引き続き可能ですが、OSはCPUにこれを防ぐように指示できます。NXビットとWindowsの「データ実行保護」設定(システムコントロールパネル)を参照してください。
したがって、CPUはメモリがデータであるかコードであるかを「認識」していると思います。間違いなく、最新のパイピングCPUには、CPUが可能な限り高速に処理するのを支援するために、このメモリを別の方法で読み取るための命令もあります(たとえば、コードはキャッシュされない場合があり、データはストリームではなく常にランダムにアクセスされます)