8章〜15章にまつわるQ&Aのまとめ

  • (by K, 2006.03.28)
  • いろいろQ&Aが集まったと思うので、ここにまとめておこうと思います。
  • ここで答えが見つからなければ、q_and_aへ!

質問と答え

  • [p.167(8-5)] プロテクトモード移行に関して、MOV CR0,EAXの時点ではCSやDSは0のままだけど、これでいいのか? GDTの0番のセグメント設定を見ると、これはよくないように見えるが・・・。
    • はい。実はCR0を切り替えただけでは、CPUはGDTを参照しません。セグメントは16bitモードのときのまま解釈されます。GDTを参照するのは、DSやESなどへ値を代入するときです。もしくはfar-JMPやfar-RETなどでCSに値を代入するときです。逆にいうと、それまではGDTの準備が完了していなくてもいいくらいなのです。
  • [p.179(9-2)] memtest_subのnot_memory:のところで、 *p = old; という処理は必要ないのではないか?だってメモリがつながっていないところに値を書き込んでもどうせ記憶されないんだから。
    • 大変鋭い指摘です。確かに番地につながっているのが、RAMやROMだけしかないのであれば、oldの書き戻しは完全に不要な処理といえます。しかし実際はRAMでもROMでもないものがつながっている場合もたまにあります。よくあるのがメモリ接続型I/Oで、これはつまり、IN命令やOUT命令ではなくMOVで制御するタイプの装置です(そういう装置もたまにあるんです)。こういうものがつながっている場合は、それぞれのビットに意味があって、でも一部のビットだけが"1"に固定されているとか、そういうことがよくあります。そういうものであれば、memtest_subはメモリではないと気が付くことができます。このようなものの場合、勝手に反転した値を書いたままではなにか副作用を起こしてしまうかもしれないので、元の値に戻したほうがいいと思います。・・・とまあそんなわけで、たぶん多くの場合ではこのような復元処理は不要であろうとは思いますが、場合によっては役に立つので入れています。入れてもそれほど処理が遅くなるわけではありませんしね。
  • [p.180(9-2)] メモリ容量チェックにおいて、チェックを3GBまでとしているのはなぜですか?
    • PentiumなどのCPUは最大で4GBのメモリを認識できますが、この4GBのすべてが普通のメモリになるわけではなく、たいていは後ろのほうがVRAMなどになっています。こういう普通じゃないメモリを全部足しても1GB程度で済むかなと思って、3GBまでのチェックにしました。・・・もちろん3.5GBとか3.9GBまでのチェックにしてもいいのですが、実際問題としてメモリスロットの数を考えると、そういう半端な容量は実現しないような気がします。合計4GBのメモリをつけたときには普通のメモリとVRAMがつながってしまうかもしれません。その場合、どこまでが普通のメモリか分からなくなるので、とりあえず安全策として3GBで打ち切ることになります(最近のグラフィックカードのVRAM容量は512MBくらいあり、さらに他のメモリ入出力型装置も使うかもしれないことを考えると、やっぱり3.0GBを越えてチェックするのは少々怖い気がします)。
  • [p.184(9-3)] memtest_subをわざわざアセンブラで書き直さなくても、pをvolatile属性にすればいいのでは?
    • 実はそのとおりです。でもvolatile属性をつけて終わりにしてしまう方法で解決してしまうと、いざというときはアセンブラで書き直す(たとえばコンパイラのバグに悩まされた場合など)みたいな場合に応用がきかないのです。さらに、どっちが説明がわかりやすくて話が面白いかなーと考えて、結局本文はアセンブラで解決する話にしました。実はコラムでvolatileのことを少し紹介しようと思っていたのですが、締め切りに追われているうちに書き忘れてしまいました。そんなわけで、volatileについて一言も書いてなくてどうもすみません。

こめんと欄

  • 本文に間違いを発見しました。
    「締め切りに終われているうちに」=>「締め切りに追われているうちに」 -- Triangle Ld. 2010-04-07 (水) 20:17:24
  • どうもありがとうございます、なおしました。 -- K 2010-08-08 (日) 09:18:28

コメントお名前NameLink

リロード   新規 編集 差分 添付   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
Last-modified: 2010-08-08 (日) 09:18:41 (3451d)