コンピュータの知識を得ようぜ 第??回
すみませんもう何回目か忘れてしまいました。
小さな規模で細々とやっている勉強会。
ぼくがゴネて「コンピュータの知識を得るならOSだよ!」と無理矢理に誘導して、なぜかxv6 (UNIX version 6、LION 本のネタの x86 へのポーティング) の勉強会になっております。
MIT の OpenSourceWare にOS入門の講義ページがあって、講義ノートが全部上がってます。URL 変更あったらしくて俺のはてブリンク切れてるわ。直しとかないと。
今回は第4章、アドレッシングをセグメントレジスタでやるよ話。
つかほとんどがx86のアーキテクチャの話に終始してた気がするんですが気のせいですか。気のせいですよね。
まず前提。論理アドレスを物理アドレスにするためにはハードウェアのサポートが絶対必要だよと。だってメモリアクセスごとにソフトでごりごりやってたらプログラム実行する前に戦争が終わっちまうぞ! って感じだから。
んで方法としてはセグメントを使う方法とページングを使う方があるよと。この章ではセグメントについて説明するよと。
この講義なんだかよくわからない話の飛び方をするんだけど、セグメントにせよページングにせよ、誰もが勝手にアドレスマッピングいじれたらまずいよね。まーそらそだ。
とゆことで、特権レベルの話も出てきます。
カーネルもユーザーアプリも同じように論理アドレス空間を割り当てられることは一緒なんだけど、ユーザーアプリはそのマッピングを変えることはできない。それはカーネルに「おねがいっ」ってやってもらうんだよとかそんな話。
そいで実際の話に入ってくんだけど、まずリアルモードの話がちょっとあって、リアルモードだとセグメントを4bitシフトしてオフセット足すことで、レジスタとしては16ビット幅しかないのに20ビットのメモリ空間を実現してる。
けどプロテクトモード*1 の場合だとレジスタは32ビットでメモリ空間も32ビット。だからセグメントは意味を持たない。じゃ、別のやり方で使えますね。ってな話があったなあ。
x86 には GDT (Global Descriptor Table) ってのがあって、これをつかってアドレス変換を制御するんだよ、GDT をさわれるのは特権レベルの奴だけだから、だからカーネル以外から保護されてるんだよハハン、みたいなこと書いてあるんだけど、だから GDT ってなんやねん! って説明がない。先に進んだらあるかと思ったら、どうもなさそう。
所詮講義ノートなので 80386 のデータシートよめってことなのかなあ。英語版 Wikipedia の GDT の解説を読むと、ちょっと分かるかも知れない。
で、なんだか狐につままれた感がありつつも先に進むと、xv6 の話になる。そのまえに UNIX version 6 についての説明がつらつら書いてあって、小さくてたった二人で書かれてでもちゃんとしたOSで詳しくはLION本読め! と力強く書いてあって、xv6 は授業用に x86 に移植したんだよーん、でもごめん全部のシステムコールサポートしてるんじゃないんだはっはっはとかあって、時間切れ。
まあこの章と次の章 (ページングによるアドレス変換) を読んだら、xv6 の実コード読んだ方が楽しいかもね。とか思ってます。
しかしぼくはこういうの猛烈楽しいんだけど、他の人どう思ってんだろ?