Linuxカーネルの起動(起動プロセス)

Linuxカーネルの起動(起動プロセス)

Linuxブートプロセスを理解しようとしています。

私が理解しているように、最初のステップ(GRUBによって設定)でカーネル(圧縮されたイメージファイル)がメモリにロードされ、解凍されます。

コントロールがカーネルに渡されると、これは実際にどのように行われますか?カーネルはCソースコードでコンパイルされますか?カーネルが実際に実行される方法。

この記事を読んだが、私の質問に対する答えがないようです。

LinuxカーネルイメージをRAMにロードした後に何が起こりますか?

ベストアンサー1

カーネルはCソースコードでコンパイルされますか?カーネルが実際に実行される方法。

この時点でカーネルコードはコンパイルされ、プロセッサに直接渡すことができる形です。もしイメージファイルの圧縮.JPGや.GIFファイルなどの画像を参照しません。メモリイメージ- カーネルの実際の機械語コードを1:1で表現します(圧縮解除後)。

古いプロセッサでは、実際の命令バイトが単にプロセッサ内部論理ゲートのハードウェアマトリックスに供給される。命令デコーダ:次に、他のゲートがその特定の命令に従うデータバイトをプロセッサの必要な部分に渡し、他の必要な操作をトリガできます。最新のプロセッサには、通常、ソフトウェア制御の追加層があります。マイクロコードプロセッサの。

コントロールがカーネルに渡されると、これは実際にどのように行われますか?

これは、システムのファームウェア+アーキテクチャによって異なります。従来のx86 BIOSでは、ファームウェアとブートローダは通常、最初のIBM PC / ATで原則として実行できる16ビットコードです。ここで、制御転送は本質的にブートローダコードからカーネルとして実行されるものである。コードのジャンプコマンドと再び戻りません。

カーネルコードの最初の部分には、カーネルコードの残りの部分を解凍し、BIOSから残された有用な情報(それ以外の場合は上書きされます)を取得し、プロセッサを32ビットまたは64ビットに変換する解凍ルーチンが含まれています。ビットモード。このプロセスでは、RAMのブートローダコードが上書きされる可能性があるため、カーネルコードからブートローダに戻るというアイデアは無意味になります。

UEFIファームウェアを搭載した最新のPCでは、UEFI仕様にはファームウェア/ブートローダと実際のオペレーティングシステム間の標準切り替えプロトコルが含まれていますが、最終的にはコードブロック(=ファームウェア/ブートローダ)から起動するためにプロセッサがジャンプコマンドを実行します。 。プログラム)を別のブロック(=カーネルの最初の部分)に転送して返す意図はありません。

おすすめ記事