Linuxのブートプロセスをみる現時点では今後どうなるのか良くわからないアスキーの鈴木さんからもらったLinuxのブートプロセスをみるを読み始めた。Linuxのブートプロセスをみる(白崎博生)役に立つかどうかは別として無暗におもしろい。最初はx86(x64)マシンのブートから始まるので、8086互換のリアルモードに始まって、次にプロテクトモード(これ、以前はプロテクトッドモードではないかとかいろいろ言われてたような気がするけど、今はプロテクトモード一択で落ち着いたのかな)経由でx64の場合はさらにIA-32eモードに推移するまでの石の動きの説明で始まる。説明するにはリアルモードがあるためにセグメントの説明からIOポートの説明まであり、と、どんどん深みにはまっていく。x86についての前提知識のために、ある項目を説明するにはある項目の知識が必要で、しかし順序からはその知識の説明は後回しにせざるを得ず、という状態で、本書そのものが複雑なブートプロセスで構成されているのだが、意図的だとしたら面白すぎる。言う具合にPC/ATアーキテクチャの説明を読み終わると1章が完結して全体の1/4くらい。全体が付録含めて10章だから、いかにx86がぶっ飛んだCPUかが良くわかる。以下、読んでいてひっかかった表現など。・P26先頭......必要なセグメントデスクリプタを並べて作成し、その開始アドレスと数をCPUに通知する命令を実行します。これをセグメント・デスクリプタテーブルと呼びます。命令を実行することがテーブルみたいに読める。おれなら「必要なセグメントデスクリプタを並べて作成し(これをセグメント・デスクリプタテーブルと呼びます)、その開始アドレス......命令を実行します。・P26「その数は65,536(0xFFFFH)」意味はわかるがちょっと変。あと、0xをプリフィクスしているのにHをポストフィックスする記法が妙かな。上位13ビットの数を8倍した値がオフセット位置だが、実際には下位3ビットをマスクすれば求められると書いているけど、それはその通りなんだけど、てへぺろ感があるような。・P.28表コンフォーミングコードって何?(検索してみるとユーザーモードのままで実行できるカーネルメモリ内のコードという意味っぽい)・他にも表か図で何か気付いた(たいてい校正するとき表の中は見落とすんだよなと思った)のだが忘れた。・そこはツッコミどころではなく楽しみ箇所さんざん引っ張ってからこれはLinuxでは使わないのでどうでも良いですというのと、最初からこれはLinuxでは使わないので説明しません、というのが混在していて、つまり前者は書きたかったんだろうなと想像すると楽しい。いうか、x86ってつくづく化け物だな。互換性を維持しながら高速に処理可能なように拡張方法を設計しているはずなので(マスクとフェッチと論理和のみで済むのかな)、それにしても良くこういう仕組みに作ったなぁと畏敬の念を覚えると同時に、ゼロベースで設計してこれに勝てない(いや、ARMがあるというのはあるけど)他のCPUというのはなんなのだろうという不思議というか。