5 章: 構造体と文字表示と GDT/IDT 初期化

VRAM に表示する方法は出来たので次は文字表示、I/O に依存する printf は使えないけど sprintf は I/O に関係ないので、コンパイラ付属のライブラリからリンク。フォントデータは '*' と '-' からなるアスキーアートで「A」などを書いたテキストファイルから生成。マウスカーソルも同じように生成し、文字とマウスカーソルの表示に成功。

次に「セグメント」のお話。メモリアドレスは「0x00000000 から 0xffffffff」まであるけど、このままでは、将来複数のプログラムを実行するときに、いちいち開いているアドレスを探してそこにロードするという今年なくてはならない。それを回避するひとつの技がセグメントということらしい。具体的にはメモリ空間をセグメント単位で分けることで、セグメントの先頭を 0 番地として扱うことが出来るというもの。セグメントごとに実行プログラムを配置して実行すればアドレスが重なることなく実行できるということらしい。仮想アドレスを実現するページングはこの本では取り扱わないとのこと。

セグメントについてかいつまんで説明すると

  • 開始アドレス、サイズなどの各セグメントの情報のサイズは 8 バイト
  • セグメントの個数は 8191 個。どのセグメントを利用するかは セグメントレジスタ(16bit) の上位 13 ビットに 0 ~ 8191 の値を設定し、指定する。
  • すべてのセグメント情報、つまり 8 バイト× 8191 = 65536 バイトはメモリ上に確保する。
  • 65536 バイトのテーブルを GDT(= global (segment) descriptor table) と呼ぶ。
  • そして、GDT の先頭アドレスは GDTR に設定しておく。

とのこと。肝心の segment が括弧という GDT の名称が少し気になりますが…。まあそれは置いといて、これで

GDTR + セグメントレジスタに入っている値 * 8

で各セグメントの情報を取得できるという算段のようだ。

次 IDT。interrupt description table の略で、これは全部で 0 ~ 255 のエントリからなる外部割込み用のベクタテーブルのようだ。

5章は GDT、IDT について概要の説明とそれぞれを設定するプログラムを作成して終わり。6章以降で実際に割込み制御などを行っていくようだ。が、まだ 8 バイトの中身の説明などは詳細の説明がないので、個の後も延々説明が続くような気がする。

5日目にして急に内容が難しくなってきた。でも、ポインタ変数が明後日なアドレスを指していたときに Segmentation fault でプログラムが止まる理由が少し分かったような気がします。セグメントのサイズを越えてアクセスしようとしたときに出るエラーって事だな。

5章終わり。

トラックバック(0)

このブログ記事を参照しているブログ一覧: 30日で作る自作OS 7/30 - セグメント

このブログ記事に対するトラックバックURL: http://tsuyuguchi.com/mt/mt-tb.cgi/186

最近の画像

Zero History - ギブスンの新作が 9 月に発売 -
虐殺器官
ドミニオンのランダマイザアプリ、dominion minion が日本語対応!
ハイペリオンの没落 ~ 完結...でもまだ続く~
ハイペリオンの没落 ~ 完結...でもまだ続く~
ハイペリオン - 長大な叙事詩 SF のスタート -
ハイペリオン - 長大な叙事詩 SF のスタート -
「都市と星」 - 10億年と言われてもよく分からない -
「星を継ぐもの」 - 良い Sci-Fi -
トールサイズのニューロマンサーを買った
虎よ、虎よ! - 主人公フォイルの執念の物語 -

私の本棚

 

自転車走行距離

自転車走行距離

Flickr Photos

FlickrPhotos

なかのひと

Y!ログール

このサイトについて

2015年2月

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

アーカイブ

My Update

  • Loading...

その他

あわせて読みたいブログパーツ