プロセッサでは、データ、アドレス、および命令はどのように区別されますか? 0
プログラムが実行されるとき、すべてがs と1
s にあり、レジスタが両方のデータ、アドレスをロードする場合、プロセッサはどのように命令を区別しますか?
3 に答える
プロセッサは、指示されたことだけを実行します。お気づきのように、プロセッサはメモリ内の「データ」と「コード」の違いを区別できません。それはすべて単なるバイトのシーケンスです。それがどのように扱われるかを定義するのは、それらのバイトをどうするかです。
プログラムがコンパイルされると、生成された実行可能ファイルには、どの部分がコードでどの部分がデータであるかを示す情報が含まれています。プログラムが実行されると、オペレーティング システムはコードとデータをメモリのさまざまな部分にロードし、プログラムのエントリ ポイントでコードの実行を開始するようにプロセッサに指示します。そこから、プロセッサは最初の命令をフェッチして実行し、次の命令に進みます。
もちろん、それはすべて非常に単純化されていますが、あなたはその考えを理解していると思います.
古いプロセッサや古いオペレーティング システムでは、データ セグメントの途中にある命令の実行を開始するようにプロセッサに指示することを妨げるものは何もありません。または、実際には、コードセグメントの途中で「データ」を変更することで、自己変更コードを作成します。新しいプロセッサとオペレーティング システムには通常、コードの変更を防ぐための何らかの形式のデータ実行防止機能とロック機能があります。そうしないと、自己変更コードが大きなセキュリティ リスクになる可能性があります。
簡単に言えば、プロセッサーはコードをコードとして扱います。それ以外の場合、すべてがメモリ内の単なるバイトです。
さまざまなレジスタは、プロセッサがコンピューター上で実行されているプロセスでメモリのさまざまなセグメントを区別するのに役立ちます。プログラムが開始すると、コード セグメント レジスタ (cs) と命令ポインタ (ip/eip/rip) がコードの場所を指すように設定されますが、データ セグメント レジスタ (DS) と汎用レジスタの 1 つ (通常は DX) ) は、データ セグメントを指すために使用されます。それは主に Intel x86 アーキテクチャですが、一般に、ほとんどのアーキテクチャには、スタック セグメントと同様に、データ領域からコード領域を区別するためのレジスタがあります。これらのレジスタを介して、CPU はコード アドレスを「認識」するか、区別することができます。
アプリケーションを起動すると、eip (プログラム カウンター) がプログラムのテキスト データの場所に設定されます。テキスト データはコード (0..1) です。ここから eip に書かれているアドレスから命令を実行し始めます。命令は、cpu (またはキャッシュ) の近くの ROM で定義されます。万が一、cpu が命令ではない何かを実行しようとすると、例外 (このレベルでの割り込み) がスローされます。それが命令であるかどうかを彼がどのように知っているか、フェッチである foreach 命令が有効な命令であるかどうかを確認するために rom like とハッシュテーブルをチェックすることを想像していません。
多くのことが XDD で発生するため、これは問題に対する非常に単純なアプローチです。