15

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

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

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

教えてくれてありがとう!/MS

4

6 に答える 6

10

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

于 2010-01-07T18:19:01.327 に答える
7

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

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

プログラムカウンターをデータと見なしたものに向けることは完全に可能でした。実際、私の教授がまさにそれを行った古い大学のチュートリアルを覚えています。私たちは彼に間違いを指摘しなければなりませんでした。彼の応答は「しかし、それはデータです!それは実行できません!それはできますか?」でした。その時点で、私はデータに有効なオペコードを入力して、実際に実行できることを証明しました。

于 2010-01-07T18:11:01.213 に答える
3

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

  1. 命令をCPUにフェッチします
  2. 実行用にCPUを構成する命令をデコードします
  3. 命令を実行します。

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

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

于 2010-01-21T18:20:37.857 に答える
2

プロセッサによって読み取られる各読み取りは、データフェッチまたは命令フェッチであることが知られています。新旧のすべてのプロセッサは、データフェッチからの命令フェッチを認識しています。もちろん、ARMがそうではないハーバードアーキテクチャプロセッサを除いて、外部からはわかる場合とできない場合があります。私は最近mpcore(ARM11)を使用していますが、外部インターフェイスには、読み取りの種類について少し説明するビットがあります。主に外部キャッシュを接続し、それをmmuがあるかどうかの知識と組み合わせます。 L1がキャッシュされ、命令からデータを区別できますが、これはルールの例外です。メモリバスの観点からは、命令からのデータを知らないのは単なるデータビットです。

于 2010-01-10T01:51:19.820 に答える
0

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

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

したがって、CPUはメモリがデータであるかコードであるかを「認識」していると思います。間違いなく、最新のパイピングCPUには、CPUが可能な限り高速に処理するのを支援するために、このメモリを別の方法で読み取るための命令もあります(たとえば、コードはキャッシュされない場合があり、データはストリームではなく常にランダムにアクセスされます)

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

于 2010-01-07T18:21:00.803 に答える
-2

したがって、CPUはメモリがデータであるかコードであるかを「認識」していると思います。間違いなく、最新のパイピングCPUには、CPUが可能な限り高速に処理するのを支援するために、このメモリを別の方法で読み取るための命令もあります(たとえば、コードはキャッシュされない場合があり、データはストリームではなく常にランダムにアクセスされます)

于 2016-12-02T13:55:38.343 に答える