Yabu.log

ITなどの雑記

「はじめて読む486」を読んだ

tcfmのruiさんが勧めているのを見て買いましたが、

結果的に30日OS自作本*1の良い副読本になりました。

紙の本は500ページ近くあります。電子版を買って正解だと思います。 私が買ったのはKindle版ですが、本当は達人出版会から出てるDRM FREEのePubを買うべきでした。

tatsu-zine.com

古いのか?

この本を買おうかどうかで迷っている人が心配している点は

  • 486という古いCPUの知識なんか役に立つのか?
  • 20年前の本なので内容は流石に風化しているのではないか

という点でしょう。

また、この本の出版は1994年の本です。windows3.1が出始めて16bit -> 32bitの移行が進んでいる時期?だと思われます。 私が最初に触った記憶があるOSであるWindows95(1995)はまだ出現していません。

達人出版会の日付によると、電子版は2014年に発売したようです。 なんと初版発売から20年後です。 電子書籍についてよく調べられている方はご存知だと思いますが、古い本でリフローなePub形式のものを 販売しているものはほとんどありません

ここまで気合を入れて電子化している古い本は少ないと思います。 内容について、最新のCPU情報に詳しくないため、私が内容が古いかどうかの判断はできませんが、 電子書籍化している点から、記載内容の妥当性/有効性はまだまだ通用するぞ、という自信を感じます。

内容は古くないと思います!(多分)

30日OS自作本と比較して

  • 例外
  • プロテクトモード
  • コールゲート

などはこちらのほうが情報が充実しておりわかりやすかったです。 またページングはOS自作本では一切出てこないので精読してこんな記事を書きました。

yuyubu.hatenablog.com

同じようなことが買いてる部分もありましたが、別の視点からの説明を読み取ったり、 一方で間違えて覚えたものの誤解や不理解を他方で学び直すことで理解を深めることができました。

30日OS自作本との愛称はバッチリだと思います。 とにかく、この本と30日OS自作本で低レイヤーに対する基礎体力みたいなものはかなり身についたと思います。

30日でできる! OS自作入門

30日でできる! OS自作入門

本書中に書いてある面白いエピソード

クロックダブラー、クロックトリプラー

クロックの速度を2倍、3倍に加速させる装置がある メモリ等などのIOが発生せず、CPU内で完結させられる処理のみの場合、 この機能を使えます。

  • 486Dx2/ODP:クロックダブラー 33MHz -> 66MHz
  • DX4:クロックトリプラー 25MHz -> 75MHz

通常の3倍ってやつですね。赤いあれ(若い人がわからないやつ)

CPUの互換性はマルチタスク中にも利用できる

486には8086用の実行バイナリを動かす互換機能がありますので、 それを使って486で8086用の実行バイナリが動くのは、なんとなく想像できますが、

  • 486用のコードと8086のコードをマルチタスクで並行して動作させることが可能

こんな機構があるのは想像できませんでした。

この機能を実現させるために、 486ではマルチタスクの際にレジスタ退避に利用するセグメントの中身に、 CPUの互換モードに関するフラグが含めています。(EFLAGSの17bit目のVMフラグ)

タスク切り替えの際にこのFlagを使ってCPU互換モードを切り替えつつ平行稼働できるようです。

A20制御回路:アドレスバスのオーバーフローを利用した古いコードをサポートするハードウェアがある

メモリバスが20bitであることを逆手に取った(オーバーフロー)プログラムが過去にあったそうです。

20bitを超えるようなアドレスを指定して、オーバーフローの結果出来上がる小さなアドレスを利用し、 先頭近くのアドレス、主にOSがシステム的に使っているメモリに不正に?アクセスするようなものだそうです。

本来ならセキュアな範囲のアドレスにアクセスするためには 所定の手続き(OSに代理でアクセスさせる命令を使う、権限を切り替える等) が必要になるとおもいますが、メモリバスを通す前はオーバーフロー前のアドレスで検査されるため この方法でそれを省略しています。hackな手法だとおもいますが、 個人的にセキュリティ的にもこのようなアドレスバスの利用は好ましくないものと思います。

メモリバスが20bitから23bitに拡張された際にこのオーバーフローを利用したプログラムは動かなくなりました。

そんな不届きな?プログラムの動作の互換性をサポートする仕組みが486に存在しているのです。それがA20制御回路です。

そもそもの仕様を逆手に取ったコードをサポートする必要があるのか、など思うところはありましたが、 CPUベンダがサポートを決断した、ということはサポートをせざるを得ない重要なプログラムが使っていたのかなと思います。

このA20回路のオーバーフローを利用したプログラムにはどんなものがあったのでしょうか。すごく気になります。

*1:同じintel86系なので