
おそらくこれは基本的な理論的な質問ですが、答えはわかりませんし、この情報も見つけていません。
オペレーティング システム (Windows または Linux ディストリビューションを想像してください) は、あるマイクロアーキテクチャで実行されるのか、それとも別のマイクロアーキテクチャ (たとえば、Intel Sandy Bridge アーキテクチャまたは Intel Haswell アーキテクチャ) で実行されるのかを認識する必要がありますか? それとも、OS はこの詳細を認識していないのでしょうか?
オペレーティング システムはユーザーとマイクロプロセッサ アーキテクチャ間の「橋渡し」であるという事実から、OS はそれらの詳細を知る必要があると私は考えるようになりました。なぜなら、おそらく、Intel Sandy Bridge と AMD Bulldozer では OS の動作が同一ではない部分があるからです。
答えが「はい」の場合、ハードウェアはそのアーキテクチャである OS とどのように通信するのでしょうか?
答え1
Intel と AMD x86 (および x86_64) は、オペレーティング システムに関する限り、同じプロセッサ「アーキテクチャ」です。「コア」命令セットは同一であり、プロセッサの最小機能レベルを定義します。
プロセッサの動作は全く異なる可能性がある内部的にあるいは物理的にしかし、命令のマシンコード(16進バイト)に関しては、それらは同一です。外部アーキテクチャ(x86)は同じですが、異なります。内部アーキテクチャ (多くの場合、uArch またはマイクロアーキテクチャと呼ばれます)。
その結果、基本的なマザーボードの起動とプロセッサの初期化を行うシステム ファームウェア (UEFI) からオペレーティング システムへの最初のハンドオーバーは、バイトをロードしてコード パスを選択するための同じ命令が同じであるため、AMD と Intel で同一になります。ブート コードが実行されると、CPU 拡張機能を検出し、見つかった内容に応じて最適化されたコードを実行できるライブラリのロードを開始できます。
ARM と x86 は内部的にも外部的にも完全に異なるアーキテクチャであり、同じマシン コード バイトから生成されるコードはまったく異なるか機能しないコードになります。そのため、正しいマシン コードを生成するには、ブート実行可能ファイルを、実行される特定のアーキテクチャを対象にコンパイルする必要があります。