書籍の補足情報

書籍の内容について,出版後に気がついた点などをその都度追記していきます.

■ 最初に説明するアーキにPowerPCを選んだ理由 (2014/10/04)

最初に扱うアーキは,以下の基準で選びました. この点でMIPSとPowerPCが候補だったのですが(そして個人的にはぜひMIPSにしたかった のですが),MIPSは以下の点で追加説明が必要になるので,最初は説明が極力少なく 済むもの,ということでPowerPCを選択しました. (PowerPCで基本を説明したあとに,MIPSで追加として以下を説明する,という流れに して一度に説明することを減らしたほうが,初心者が混乱しないと思った)

■ SHのPC相対について (2014/10/04)

※ 本件は,電子書籍版にて修正しました (2015/07/06)

PC相対によるメモリアクセスの際に,PCの値が4バイトアラインメントされて いるという記述がありますが,すみませんちょっと筆者の勘違いが残ってしまって いたようです.(情けない…)

sh-elf.dを実際に見てみたところ,以下のようになっているようです.

わりと大きな間違いが残ってしまいすみません.校正は頑張ったのですが, SHの章はわりと早い時期に書いていた部分なので,チェック漏れでそのまま 残ってしまったようです.増刷などで修正の機会があれば直したいです.

■ PA-RISCの遅延スロットの扱いについて (2014/10/04)

※ 本件は,電子書籍版にて注意書きを入れました (2015/07/06)

書籍中で「PA-RISCでは遅延スロットの有無を選べる」とありますが, どうも「Nullification」というPA-RISC特有の機能で, 後続の命令を条件次第でスキップできる,というもののようです.

詳しくはネットで検索してみると,さらに詳しい情報が得られるかと.

■ 各アーキテクチャのエンディアンについて (2014/10/05)

書籍中では各アーキテクチャのエンディアンは, 「このアーキはビッグ,このアーキはリトル」みたいにして 決めうちにして説明しています.

が,実際には両エンディアンに対応しているアーキテクチャも多いです. そういうのは「バイエンディアン」と言います. 動的に切り替えて使えるようなプロセッサも多いです.

で,それでも普通は「標準的にはこっちのエンディアンで使われることが多い」 というのがアーキテクチャごとにあったりもするのですが,分野によってその 「標準的なエンディアン」が異なっているアーキテクチャもあったりします. 例えばMIPSはリトルエンディアンとビッグエンディアンの両方がありますが, ワークステーション用に利用される場合はリトル,組込み系で利用される場合は ビッグが標準,みたいになっています.ああややこしい.

そしてgcc側では,これらはgccのビルド時に指定できたりもします (例えば「mipseb」みたいにしてアーキ名に「eb」とかついたらビッグエンディアン, 「mipsel」みたいに「el」がついたらリトルエンディアンを示していたりします). が,書籍中ではgccを標準的にビルドしたときのエンディアンを, そのアーキの標準的なエンディアンとして扱っています.

■ x86-64のred zoneについて (2015/01/04)

※ 本件は,電子書籍版にて注意書きを入れました (2015/07/06)

p.393のx86-64の解説で,スタック上の獲得していない部分を利用しているという 記述がありますが,x86-64のABIで定義されている「red zone」というものの動作の ようです.

(サイボウズラボの竹迫良範さんより情報をいただきました. 竹迫さん,ありがとうございました!)

red zone ですが,軽く調べてみたところ, スタックポインタを越えて未獲得の部分を利用する,というもののようです (ていうかその未獲得の部分を「red zone」と呼ぶ).

スタックポインタの加減算を避けることで命令の依存性を少なくし, パイプラインが効率的に動作するようにする(もしくは最適化をしやすくする?) ためのもののようです.

コンパイラの機能であり,gccでは以下で抑止することができるようです.

-mno-red-zone
以下,man gcc より引用です.
       -mno-red-zone
           Do not use a so called red zone for x86-64 code.  The red zone is
           mandated by the x86-64 ABI, it is a 128-byte area beyond the loca-
           tion of the stack pointer that will not be modified by signal or
           interrupt handlers and therefore can be used for temporary data
           without adjusting the stack pointer.  The flag -mno-red-zone dis-
           ables this red zone.
要約すると,以下のようなことが書いてあります. 疑問点は,割込みハンドラで破壊されないということがどのようにして保証されて いるのかですが,OSの割込みハンドラのほうで,スタックは128バイト減算してから 利用するというような考慮がされているのかなあ…とか推測しています. (あくまで推測ですが)

■ cross-20130826 でのM・COREの不備について (2015/10/22)

シミュレータ動作のためのサンプルプログラムで, M・COREのスタートアップに不備があることが判明しました.

現状,スタックポインタであるR0の設定が行われておらず, GDBシミュレータが初期化時に設定したスタックポインタのまま動作しています. (動作に実害があるわけではありませんが,他のアーキテクチャでの実装と 食い違っています)

cross/exec/lib-mcore-elf.S に以下の修正を入れることで,他のアーキテクチャと 同様に,リンカスクリプトで指定されているスタック位置がスタックポインタに 設定されるようになります.

        .globl  _start
        .type   _start, @function
 _start:
        lrw     r7, _estack
+       mov     r0, r7
        jsri    main

■ 誤記など


メールは kozos(アットマーク)kozos.jp まで