Grub 2.00に基づくX86カーネルブートプロセス-ソースコードシナリオ分析(2)



X86 Kernel Boot Process Based Grub 2



ディスクの導入に伴い、Grub2.00カーネルブートソースコード分析のトピックに切り込みました。分析プロセス全体は基本的に逆分析プロセスであり、最初にその使用法と関連する説明を紹介します [1] 、次に、Makefileを分析して、実行可能ファイルを生成する依存関係チェーンを決定し、対応するソースファイルを取得し、最後にソースファイルを分析してそのアクションを分析します。


[1] 英語を含む説明の部分については、歪みなく元の意味を維持するために翻訳されません。結局のところ、GNU GrubとLinuxカーネルのソースコードでは、すべてのドキュメントコメントは英語で記述されています。したがって、英語、x86アセンブリ言語、およびMakefileは、カーネル開発プロセスで回避できないハードルです。




  • ステージ1 :boot.imgは、マスターブートレコード(MBR)に保存されるか、オプションでいずれかに保存されます。 ボリュームブートレコード (VBR)、PCブートセクターは512バイトであるため、boot.imgのサイズは正確に512バイトです。そしてそれは次の段階に LBA48 アドレス(LBA 48ビットアドレス指定の場合、GRUBレガシーの1024シリンダーの制限が回避されます) `boot.img 'の唯一の機能は、ローカルディスクからcore.imgの最初のセクターをロードしてそれにジャンプすることです。
  • ステージ1.5 :core.imgは、デフォルトでMBRと最初のパーティションの間のセクターに書き込まれます(これらのセクターが空いていて利用可能な場合)。レガシーの理由により、ハードドライブの最初のパーティションはセクター1(カウントは0から始まります)ではなくセクター63で始まり、62セクターの空き領域のギャップが残ります。そのスペースはパーティションやファイルシステムの一部ではないため、それに関連する問題が発生することはありません。実行されると、core.imgは、その構成ファイルと必要なその他のモジュール、特に ファイルシステム インストール時にドライバーは、diskboot.imgから生成され、ステージ2をロードするように構成されます。 ファイルパス
  • ステージ2 :ステージ2に属するファイルはすべて、のサブディレクトリである/ boot / grubディレクトリに保持されています。 /ブート によって指定されたディレクトリ ファイルシステム階層標準 (FHS)。

Grubのx86ソースコードは主に4つの部分に分かれています。つまり、ディレクトリgrub-core / boot / i386 / pcにあるboot.S、ディレクトリgrub-core / kern.cにあるdiskboot.S、startup_raw.S、およびGrubmainです。メインモジュール関連のコード。



2.1ステージ1:boot.img分析

GNUソフトウェアエンジニアリングは基本的に、実行可能ファイルのインとアウトを記述するためにMakefileに依存しています。コンパイルプロセスでは、実行可能ファイルの生成プロセスを分類できます。どのソースファイルがコンパイルされ、どのライブラリがリンクされ、objcopy、stripなどのバイナリファイル操作が追加で存在する場合があります。 boot.imgのインとアウトでは、Makefile内のboot.imgの依存関係チェーンをまっすぐにする必要があります。





Makefileの依存関係チェーンから、MBRに格納されているブートローダーのソースコードがboot.Sであることがわかります。もちろん、コンパイルプロセスには他の詳細も含まれますが、ここでは詳しく説明しません。

まずboot.Sを分析してみましょう。当初、分析のためにいくつかの重要なコードスニペットを抽出することを計画していましたが、boot.Sのコードはワンストップの実行フローであり、相互の基盤を築いていますが、非常に簡潔で明確です。 boot.SはMBRのブートローダーであるため、電源を入れたときに何が起こるのか、オペレーティングシステムがどのように段階的にガイドされるのかについて興味がある場合があります。電源を入れた瞬間は以下のとおりです。












結論:MBRのboot.Sの唯一の機能は、ハードディスクの2番目のセクターのコンテンツをメモリにロードし、そのエントリ機能にジャンプして実行を続行することです。 Stage1のboot.imgの説明をより深く理解している場合: 「 `boot.img 'の唯一の機能は、ローカルディスクからcore.imgの最初のセクターをロードしてそれにジャンプすることです。'