回答:
現在のすべてのx86互換コンピューター(これにはIntelとAMDのx64アーキテクチャが含まれますが、Itaniumは含まれません)は、20年以上前の元のIBM PCとまったく同じように、x86リアルモードでブートセクターコードを実行します。これはカーネルモードではなく、メモリ保護、マルチタスク、またはコード特権レベルのない元のセグメントモードです。
フロッピードライブを手に入れ、MS-DOS(またはFreeDOS)を入れて、今日のコンピューターに固定すると、ブートが開始されます。
保護モードに切り替えたり、メモリ保護を設定したりするのはブートコードのタスクです。そのため、推測は部分的に正しいです。ブートローダーは、x86リアルモードとして実行を開始し、保護モードに切り替えて、実際に「カーネル」(リング0)モードでOSカーネルのロードと実行を開始します。
詳細については、Windows NTの起動プロセスに関するウィキペディアの記事をご覧ください。このテーマに関する詳細がかなり記載されています。
最新の64ビットアーキテクチャはどうですか?
これは、最新の64ビットアーキテクチャを備えた最新の64ビットマシン上のファームウェアに依存します。 haimg
の答えは、x86の世界では5〜6年前の場合でしたが、今日のx86の世界では時代遅れです。
これらの最新の64ビットマシンの一部には、古いPC / ATスタイルのファームウェアがあります。他の回答で述べたように、PC / ATとほぼ同じ方法で、ディスクのセクター#0からブートストラッププログラムをロードして実行します。 これは、古いPC / ATブートストラッププロセスです。
他の最新の64ビットマシンには、新しいEFIファームウェアがあります。これらは、ディスクのセクタ#0からのブートストラッププログラムをロードしていないすべての。EFIブートローダーアプリケーションを読み込んで実行するEFIブートマネージャーによってブートストラップします。このようなプログラムは保護モードで実行されます。 これはEFIブートストラッププロセスです。
一般的なEFIファームウェアは、プロセッサリセットを終了するいくつかの指示内で保護モードに切り替わります。保護モードへの切り替えは、EFIファームウェアの初期化のいわゆる「SECフェーズ」の早い段階で行われます。技術的には、32ビット以上のx86プロセッサは、リアルモードではなく、口語ではアンリアルモードとして知られているもので起動します。(CS
レジスタの初期セグメント記述子は、従来のリアルモードマッピングを記述せず、これを「非現実」にします。)
このように、それらのEFIシステムがリアルモード入ることはないと言うことができ、適切な EFIブートローダ(すなわち、それらは使用しないときにネイティブにブートストラップするとき、すべてのを、互換性サポートモジュールを)彼らは保護モードへの直接非現実モードから切り替えているので、それ以降は保護モードのままになります。
私の知る限り、ブートコードは常にカーネルモードで実行されます。
1つは、ファームウェアによって実行される最初の命令であるという理由だけで、ブートセクターから実行されたときに使用するモードを決定することは不可能です。コードが実行を開始する前に、使用可能な命令を設定する方法はありません。したがって、設計上、ブートセクタのコードに使用できるアセンブリセットは、アーキテクチャによって事前に決定されています。
そのために特権のないモードを選択した場合、より高い特権のモードからの命令を使用することは不可能になり、ブートコードが利用可能な最も特権のあるモードで実行されるという事実をかなり強制します。
IntelマニュアルVolume 3 System Programming Guide 325384-053US 2015年1月:
2.2動作モード
プロセッサは、電源投入またはリセット後に実アドレスモードになります。
キックのために、マニュアルからの素敵な図:
GRUBは、保護モードでマルチブートOSを起動します。マルチブート仕様0.6.96マシン状態:
「CR0」ビット0(PE)を設定する必要があります。
GRUBとx86_64についてはわかりません。
multiboot
キーワードが使用されます。Linux用、そこに専用されているlinux
、linux16
GRUBのUEFIのバージョン、に、そしてlinuxefi
Linux固有のブートプロトコルを使用するようにGRUBを言って、キーワード。