Linux勉強 パート3 ブートローダーとプロテクトモード

Linux

ブートローダーとプロテクトモード

プロテクトモード

リアルモードではアドレスバスが20ビットありますが、アドレスを指定するセグメントレジスタ(CS,DSなど)は16ビットになっています。

リアルモードでは20ビットを表現するために16ビットまでしか表現できないレジスタを2つ組み合わせて20ビットのアドレスを表現する工夫をしています。
そのため使えるメモリの大きさが1M(2^20)、セグメントが64KB(2^16)という制約がありました。
プロテクトモードでは32ビットのアドレスバスを使えます。つまりオフセットが4GBまでの範囲を表せます。
続して使用できるアドレスが4GBは頼もしいですね。
しかし残念ながらリアルモードからプロテクトモードに移行しても使用できるセグメントアドレスは16ビットのままなんです。
リアルモードではセグメントのアクセス権限などをチェックする保護機能がありませんでした。

しかしプロテクトモードではセグメントを指定するベースアドレスとデータが格納されているオフセットアドレスの他にそのセグメントのサイズ、セグメントへよアクセス権限などセグメントを保護するためレジスタで表現するには情報量(8バイト)が多くなり過ぎます。

そのためにGDTR(グローバル・ディスクリプタ・テーブル)というものを用意しています。
16ビットしかないセグメントアドレスとを組み合わせてセグメントに多くの情報を持たせています。

グローバル・ディスクリプタ・テーブル(GDT)

64ビット(8バイト)ごとに分けられるデータの塊。
それぞれので64ビットのデータの塊のことをセグメント・ディスクリプタと呼びます。
セグメントディスクリプタにはそのデータのアクセス権、データ大きさ、それが置かれているメモリの場所などを管理しユーザーがそのセグメントが必要になる度に呼び出され、そのセグメントを使用する権限があるかなどを調べる為に使われます。

以下はアドレスの指定方法をまとめたものです。

GDTR
グローバルディスクリプタテーブルのアドレスを保存するレジスタ。

ブートローダー

ブートローダーはBIOSによってディスクの一番最初のセクター、MBR(マスターブートレコード)と呼ばれ512バイトの大きさのセクターをメモリアドレス0x7c00番地へと読み出されます。
ここからOSの起動はスタート。

その後BIOSはCPUのIP(インストラクションポインタ)を0x7c00へ書き換えて処理をブートローダーへ明け渡します。
IPは命令が保存されているアドレスのオフセットを指定するレジスタです。

MBRは512バイトしかないので近代的なOSを読み出すには記述できる命令が少なく、普通は2段階構成で、一段目のMBRは2段目のOSカーネルを読み出す本番プログラムをメモリへ読み込むのに使われます。
MBRの最後の2バイトは0x55、0xaaのブートシグニチャと呼ばれ、BIOSにこのディスクははブートできる、ということを証明するものです。これがないとブートしてくれず、エラーコードを表示します。

ブートローダーまとめ

BIOSはブートローダーを読み込む媒体をえらびます。
CD/DVD、フロッピーディスク、内臓のハードディスクの順に確認していき、ブートできるデバイスを見つけると一番最初の先頭セクター(セクターはデータを並べられる塊の単位)をメインメモリーのアドレス0x07C00に読み込みます。
読み込んだディスクの511と512バイト目が0x55AAという値であることを確認すると、先ほどのアドレス0x07C00にジャンプし、ブートローダーに処理を明け渡します。
0x55AAという値はブートできますという決められた印でこれがないとそのメディアは指定できません。

プログラミングおすすめ書籍

おすすめ書籍

なぜプログラムが動くのか。
平易な言葉で学べますが、初心者には難しいかもしれません。
でも読み終わった頃にはなんとなく理解しているでしょう。
初心者には家にあって損はありません。

UNIXの思想を学べます。
高尚なタイトルですが、コードはおろか難しい言葉も殆どありません。取っ掛かりに最適でその後のプログラミングに対する理解を一変させます。
なぜならこの思想はプログラミングそのものだからです。
一読の価値ありで、これは良書なので今後紹介したいと思っています。

まだまだありますがまたの機会に紹介したいと思います。

Linux コンピューター
スポンサーリンク
himazinをフォローする
私の頭の上の消しゴム

コメント

タイトルとURLをコピーしました