Personal tools
You are here: Home ブログ 学習経過 ブートローダー(その6)
« December 2010 »
Su Mo Tu We Th Fr Sa
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
Recent entries
sysfs tips 02 ohyama 2010-09-09
sysfs tips ohyama 2010-09-02
Haskell で周波数スペクトルを得る ohyama 2010-07-29
Haskell で線形識別関数の学習を行う ohyama 2010-07-19
Haskell で逆行列を求める ohyama 2010-07-16
Recent comments
Re:vim に lisp 機能をつける t.mimori 2010-12-16
Re:Haskell で周波数スペクトルを得る H.OHYAMA 2010-08-01
Re:lkml でお勉強 (その1-1) Hiroyasu OHYAMA 2009-08-21
Re:lkml でお勉強 (その1-1) kosaki 2009-08-20
Re:vim に lisp 機能をつける ohyama 2008-05-08
Categories
学習経過
GNU/Linux
 
Document Actions

ブートローダー(その6)

前回は、割り込みを無効にし、ノンマスカブル割り込み信号を送らないように設定し、A20アドレスラインの有効化処理を詳細にみてきた。
今回は、IDT、GDTの初期化処理に続いて、プロテクトモードへの移行の処理を見てゆく。

まず、lidt そして lgdt 命令を実行し、IDTとGDTの場所を指定している。
IDT は、6バイトを 0 で初期化された場所に指定されている。そして、GDT は最初の 2 バイトで、GDTの大きさを指定し、次の2バイトでアドレスを指定している。アドレスは 0 で初期化されている。
次に、GDTが存在するアドレスの設定を行う。基本の繰り返しになるが、%ds の値(ここでは、%cs と同一の値なので、0x9020)を 4 ビット左シフトしているのは、%ds がセグメントを表しているからである。

そして、I/Oポート 0xF0 そして 0xF1 に 0x00 を送っている。ここでの目的は、コプロセッサが存在する場合に、リセットを行っているらしい。
この処理は簡単に流し、次の処理を詳しく見てゆく。

次なる処理は、I/Oポート 0xA1 そして 0x21 に対してデータを送っている。ここでは、割り込みコントローラのマスクを(仮)設定している(*)。
かつてのI/O割り込みは、物理的に配線が固定化されていたらしいが、今日ではほとんどの場合において、カーネルの制御によって制御される割り込みコントローラによって、割り込みがプログラマブルに設定される事だろう。
Intel 8259 割り込みコントローラ(PIC)では、マスクレジスタとステータスレジスタによって割り込みを制御している。
PICでは、マスク可能割り込みが発生した際、マスクレジスタを参照し、割り込みが許可されている(マスクされていない)場合に割り込み信号が CPU に送られる。このように、マスクレジスタは、割り込みが許可されているかどうかを表す。そして、ステータスレジスタは、システムにおいてアクティブな割り込みがどれかを表す。
ここでは、マスクレジスタに対して全てのマスクを設定する為に、レジスタに 0xFF を設定している。ステータスレジスタに対して 0xFB と設定しているのは、ハードウェアレベルで、マスクレジスタとステータスレジスタがカスケード接続されている為である。
8259 では、2つの割り込みコントローラ(マスター、スレーブ)をカスケード接続させている。スレーブコントローラの出力がマスターの IRQ2 の入力となっている為、3bit目のマスクをクリアしている。

(*)IDTは、プロテクトモードに移行してから、init_IRQ() によってカーネルが再度初期化する。

GDT の初期化処理では、2つのディスクリプタ(カーネルコードセグメントディスクリプタ、カーネルデータセグメントディスクリプタ)を初期化している(そして、2つのGDTは保存されている。一つはNULLで初期化され、もう一つは予備用)。
初期化されたフォーマットを詳細に確認してみる。まず、リミット(セグメントの終端アドレス)は 0xFFFFF に設定されている。
先頭リニアアドレスは 0 に設定。又、精度フラグを 1 にし、セグメント長をバイト単位に設定。セグメントオフセットを 32 ビットに設定。
そして、特権レベルを 0 に設定し、タイプをそれぞれ 10 と 2 に設定する。これにより、各セグメントはカーネルコードセグメントと、カーネルデータセグメントとなる。

さて。全ての準備は整ったので、次の2行を実行する。

mov $1, %ax
lmsw %ax

これによって、システムはプロテクトモードに移行する。

Category(s)
学習経過
The URL to Trackback this entry is:
http://dev.ariel-networks.com/Members/ohyama/30fc30c830ed30fc30fc-305d306e6/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
(Required)
This helps us prevent automated spamming.
Captcha Image


Copyright(C) 2001 - 2006 Ariel Networks, Inc. All rights reserved.