|
x86 CPU
GRUB の概要 ハードディスクにGRUBをインストールする 次世代GRUBブートローダの基本設計と実装 アセンブリ言語 逆アセンブラ GNU アセンブラ入門(GAS) NASM Linux編 THE ART OF ASSEMBLY LANGUAGE(英語) アセンブラ入門 日本語技術資料のダウンロード intel 日本語PDF資料インデックス x86系レジスタ概要 80x86 30周年を控えるx86アーキテクチャ--「愛され続ける」その理由 初期RAMディスク Inside the Linux boot process ramfs, rootfs, initramfs の説明 Large Disk HOWTO Other CPU
最新のGRUBについては、 こちら からダウンロードできます。 Linux kernel の起動時にはCとアセンブラが主役になっていますので、 これを読み解くことでlinuxシステムの理解を深めます。 起動時のプログラムは、基本的に 構造化プログラミングのため、逐次処理していきます。 一般的な紹介ページにあるアセンブラとは違う点としては、 起動時のアセンブラでは、ジャンプや条件文、繰り返し等のタイミングごとに 使用するフラグの確認が必要なケースが多いことです。 せっかくですので、最新版の「grub-1.97.2」を題材にしようと思います。 解凍した後の「boot/i386/pc/boot.S」がstage1です。 ディレクトリ構造から分かるように、x86 CPUではこちらを使います。 pcディレクトリには、他にもファイルがあり、それぞれ、CD起動、FD起動、vfat起動、pxe起動です。 「cdboot.S diskboot.S lnxboot.S pxeboot.S」 「INSTALL」ファイルには、「* GCC 4.1.3 or later」を使用することが記載されています。 「gcc -v」コマンドで確認したところ、「gcc version 4.3.2 (Debian 4.3.2-1.1)」でした。 man gccのマニュアルを見ると、プリプロセッサ(前処理)するかどうかで、「.s」「.S」が使い分けられています。
まずは3つのヘッダファイルが読み込まれます。 「<file>」と「"file"」の違いについては「man gcc」に説明があります。
#include <grub/symbol.h>
システムヘッダファイルの概要です。
[ 概要 ] ・「boot.S」には、「CS:IP 0:0x7c00」とあります。 有名な、kernelのスタート地点ですね。 ・BPB(BIOS Paramater Block) = NTFS用の最初のセクタ(パーティションのセクタ数、MFT の位置等) ・HD用の「BPB」を回避する「jmp」があります。 FDの場合は通常NTFSフォーマットは使わないため、「jmp」は不要です。 ・HDが起動可能かどうかチェックする中で、 LBAで失敗した場合は、CHSを使うという箇所があります。 しかし、HD起動の場合は結局CHSだと失敗するようになっています。 遠まわしですが、要はHD起動の場合CHSは使わないということを意味します。 このあたりは、コメントから読むGRUB stage1で書いたとおりです。 ・「GRUB_BOOT_MACHINE_KERNEL_ADDR」は、 「include/grub/i386/pc/boot.h」にある以下の箇所で定義されています。 これで、stage2に制御を移してstage1は終了です。
/* The segment where the kernel is loaded. */ ちなみに、stage1.5の場合は0x2000を指定します。 今はstageという表現は使わないようです。
$ let x="0x800<<4";echo -n "0x";dc -e "10i 16o $x p" 次回は実際のbinaryと比較しながら進めていきたいと思います。 TOP |