Linux勉強 パート9 GRUBコード プロテクトモードでの処理

Linux

リアルモードからプロテクトモードへ

ソースコード

ここを参照しながら読んでみてください。
GRUB後半コード
ソースコード

real_to_protからの帰還

復習すると、プロテクトモード用のセグメントレジスタ、GDT、IDTを用意。
cr0レジスタの値を変えてプロテクトモードへ移行することをCPUに伝える。
日本語にするとそんなもんかという感じですが、実際にコードにするとリターンアドレスをなくさないようにとか色々面倒です。

プロテクトモードでの処理

メインの処理から脱線してreal_to_protを見てみました。
これでリアルモードからプロテクトモードへの移行が分かったと思います。
ここからはプロテクトモードなので大きなメインメモリを扱え、レジスタの表現できる大きさも拡張されます。

.code32
incl	%eax
cld
call	grub_gate_a20

前述の通り32ビットモードで動くことをCPUに伝えます。
cldで割り込みを禁止したあと、grub_gate_a20を呼び出し1MB以上の領域にアクセスできるように手続きをします。

grub_gate_a20というのはメモリを拡張するための処理なんですが、これを読み解く前にA20マスクについて理解しないといけません。これをしないと1MB以上の領域にアクセスできません。

これは古いコンピューターモデルの名残で、またも登場する互換性とかいうやつのために必要な処理です。

A20マスクとは

リアルモードとプロテクトモード、A20をはじめ、なんでこんな面倒なことになっているのか。
はじめから、プロテクトモードで始めてメモリも沢山使えるようにしればいいのに。
それには歴史的な理由があるのです。

コンピューターというか人間の開発したものはどんどん古くなりますよね。
新しい技術や考え方が登場するからです。
新しい規格に合わせて製品を作ると古いものが動かなくなってしまうんです。
古いものを高い金出して買った顧客を見捨てると次から買ってもらえなくなります。
なので古い規格の動く状態と新しい規格が動く状態を両方用意しておかなければなりません。

法律もそうですね。
既存の法律では裁けない新種の犯罪が出てきたらどんどん法律を更新しなければなりません。
既存の穴を補強する新しい法律を開発、さらにその穴を塞ぐ法律を開発という風にどんどん階層構造になっていきます。
なのでその法律の本質である憲法の基本原則などはどんどん深いところに追いやられ、見えなくなっていきます。
人間の作るシステムは基本的にはこういった構造になっていますね。

コンピューターも当然階層構造になっています。
例えばブラウザ起動して操作した場合、ブラウザはOSと連絡を取り、OSはプロテクトモードと連絡をします。
プロテクトモードはリアルモードと連絡して切り替わります。
そしてリアルモードがBIOSなどのハードウェアの基本となるシステムと連絡する。
このように伝言ゲームをしています。
新しい犯罪手法から守るためであったり、新しい考え方を導入するためであったり理由は様々ですがこうなっています。
なのでコンピューターのOSというのはこの前提に立って作られているんです。
OSのシステムコールなど根幹となる命令は何層にも隠蔽され、アプリケーションはハードウェアを操作したい時、OSを通して伝言することしか許されていません。
OSなどのソフトウェアは階層化して新しい仕組みや考え方を実装できるように細かくバラバラにできるようになっているんですね。

プログラミングをしたことがある人は知っていると思いますが、オブジェクト指向といった考え方が導入されると既存のやり方、古いやり方はどんどん下に埋もれていきます。
新しい考え方の元既存の言語を捨てると動かなくなるアプリケーションが出てきます。なので新しい方法を古いやり方の上に組み立てます。
それでも納得できない人たちが新しい言語を作ったりしますね。

話が逸れましたが、これを知っているとなんとなくしっくりくると思います。

A20マスク(ゲート)ついて説明します。
8086や80186という古いCPUが主流の頃のメモリの上限は1MBでした。
れは20ビットのアドレスで表現できます。

その後技術の進歩によりメモリは拡張され小さな物理的空間にさらに広大なメモリを乗せられるようになりました。

新しいモデルでは0x100000という値は普通にアクセスできるアドレスですが、古いモデルでは桁あふれして0x00000に丸められてしまいます。つまりメモリアドレス0x00000という全く関係のないところに飛ばされてしまいます。
これでは普通にアプリケーションを動かすことはおろか、そのコンピューターの安全すら保てません。
しかし、古い規格で作られたプログラムはその当時普通に業務などに使われているので、簡単に見捨てるわけにはいきません。

そこで新しいモデルのアドレスバスに細工をします。A20のアドレスバスに何が入力されても常に0になる回路を用意したのです。
これで古いコンピューターとの互換性を保てます。
そして新しいモデルのプログラムを動かしたいときはそれをその回路をOFFにしてやればいいのです。
面倒ですが当時はこうするしかありませんでした。
しかし古いモデルがなくなった現代においては無駄な手続きで、歴史を知らなければ何が何やら分からないことをしているとなってしまうのです。

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

おすすめ書籍

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

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

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

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

コメント

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