0から作るOS開発 Vol.1 ブートローダー編 0から作るブートローダー
価格: ¥0
C言語で0から作るOSを開発について説明していきます。このシリーズではカーネルの開発について説明しています。
今回はカーネルを読み込みためのブートローダーについて0から作っていきます。BIOSを利用した文字の表示やフロッピーディスクからのファイル読み込み、FAT12ファイルシステムの解釈を説明していきます。
【注意】本書のブートローダーはnasmでプログラムを行っていますが、アセンブラーの構文などは詳細に説明できておりません。別途アセンブラーの文法などを学習する必要があります。しかし、本書を読むことでブートローダーの基本的な設計はできるようになると思います。
[目次]
前回までの内容
パソコンが起動してからの処理概要
OSから利用できるBIOSのインターフェース処理
割り込みベクターとは?
割り込み処理を使って
どこからブートローダを読み込むのか?
セクターとは?
シリンダー(トラック)とは?ヘッドとは?
ヘッドは
シリンダー(トラック)は
セクタは
BIOSの処理
最初のセクターを読み込む
フロッピーの読込処理
割り込みベクタの25番目(0x19番目)
アセンブラー言語について
最初のブートローダを作ってみる
ブートローダーをアセンブルしてみる
フロッピーディスクの最初のセクターに書き込む
ようやく起動してみる
FAT12ファイルシステムのさわり
FAT12のブートセクタ
FA12のブートセクターを作ってみる
リアルモードについて少し
16ビット?
レジスタ?
汎用レジスター
汎用レジスタのその他の役割
セグメントレジスターとメモリーアクセス
セグメントとは
セグメントの指定
セグメントの開始位置
セグメントの大きさ
セグメントレジスターの種類
セグメントレジスターとセグメントとアセンブラー言語
コードセグメント内のアドレスアクセス
データセグメント内のアドレスアクセス
セグメントとセグメント内のアドレス
ES、FS、GSレジスターのセグメントへのアクセス
論理アドレスとリニアーアドレス
スタックセグメント内のアドレスアクセス
起動直後のセグメントレジスターの初期化
スタック
スタックにデータを積み上げる
スタックからデータを下ろす
その他のスタックの使い方(CALL命令)
画面に文字を表示する
文字を表示する
INT 0x10(文字表示処理)の引数
文字を表示する
文字を表示するDisplayMessage関数の動作
EFLAGSレジスター
フロッピーからデータを読み込む
INT0x13命令のフロッピードライブ初期化モード
INT0x13命令のセクタ読み込みモード
LBA(Logical Block Addressing)
LBAから物理ヘッド番号に変換する
LBAから物理シリンダー(トラック)番号に変換する
LBAから物理セクター番号に変換する
アセンブラーでLBAを物理ヘッド番号、シリンダー(セクタ)番号、セクター番号に変換してみる
物理セクター番号の計算
物理ヘッド番号の計算
物理シリンダー(トラック)番号の計算
LBA論理セクター2000を読み込んでみる
FAT12ファイルシステム
FAT12の構造
FAT領域
クラスター
クラスター番号の役割
特殊なクラスター
FATで記録できるファイル
FATの予備
FAT領域の開始セクターとサイズ
FAT領域の開始セクター
FAT領域のサイズ
FAT12のクラスター番号の読み方
読み取ったクラスター番号からファイルのセクター番号を計算する
FAT領域まとめ
ルートディレクトリ領域
ルートディレクトリ領域の開始セクタとサイズを求める
ルートディレクトリの開始セクター番号
ルートディレクトリのセクター数
ルートディレクトリから読み込みたいファイル名を探す
目的のファイル名を持つエントリーからファイルの開始クラスター番号を取り出す
ファイル領域
ファイルの読み込み
[2015/6/28]
誤字およびファイル読み込みに説明を少し追加しました。