トップ «前の日記(2006-05-25(Thu)) 最新 次の日記(2006-05-27(Sat))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2006-05-26(Fri) make

2.4カーネルの尻尾

Linux Kernel2.6では 2.6.XX-hoge の"-hoge" をmake menuconfig で指定できたが、2.4 ではどうするのだろうか。
CONFIG_LOCALVERSIONなんてのはなかった。
環境変数 で伝えられるような気もしたが、さしあたりは Plamoの真似をして、/usr/src/linux/Makefileに追記して おいた。

i686こんぱち!?

VIA C3プロセッサが、i686を謳っていながら 互換性が怪しい(特にCMOVインストラクション が実装されていない)話を思い出した。
/.Jだとか、その リンク先だとか。
GNU GCCで i686向け 最適化 するとC3で動作しない バイナリが出来てしまうという。
Plamo-4.0.3の力を借りて、ちょっと追試してみる。

バージョンは大体こんなとこ。
kernel: 2.4.27
Glibc: 2.3.3-i586
GCC: 3.3.6
そしてGNU Screen-4.0.2。

まずGNU Screenを何も考えずにmakeし、 当たり前に動作することを確認。

次に、最前のバイナリをscreen-normalとリネームして取っておき、make clean してから、
$ CFLAGS="-march=i686 -O3" ./configure && make する。

まずCPU情報。

$ uname -m
i686
 
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : CentaurHauls
cpu family      : 6
model           : 7
model name      : VIA Samuel 2
stepping        : 3
cpu MHz         : 799.886
cache size      : 64 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu de tsc msr cx8 mtrr pge mmx 3dnow
bogomips        : 1595.80

次いで動作確認。
これもscreen-i686-O3とリネーム。

$ ./screen-i686-O3
Illegal instruction
$ echo $?
132

最後に逆アセンブル。

$ objdump -c screen-normal | grep cmov | wc -l
      0
$ objdump -c screen-i686-O3 | grep cmov | wc -l
    583

おまけ。CFLAGS="-march=i686" だけ、もしくは CFLAGS="-O3"なんかの場合も、ちゃんと 動作する。cmovもないらしい。
最適化が"-march=i686 -O"だけでも動かなかった。 cmovをgrepしたら、288に減ってはいたが。

VIA C5P(Nehemiah)以降はcmovをサポートしているそうな。

<後記>
objdump -c な筈がない。-d だった。
</後記>
<後記>
元ネタがあった(ISO2022-JPらしい)
</後記>

最適化続報

今度はIntelのCPUでも追試してみた。

PentimuM。
i686向けに最適化されたscreenは動く。
最適化オプションを"-mcpu=petium4 -O3"にしても 動いた。こちらではcmov(/proc/cpuifoには出てきた)を 使ってる様子はなかった。

あれ、-mcpu=pentium4 と -march=pentium4は別なのか? 前者で作ったバイナリは(i686最適化で動かなかった) Pentium166MHzな Plamoで動く。後者では動かない(それにしても make遅い...)。
-march=pentium4するとcmovいっぱい含んでる。
これはPentiumMで動いた。

$ man 1 gcc
(ry
  -mcpu=cpu-type
      Tune to cpu-type everything applicable about
      the generated code, except for the ABI and
      the set of available instructions.
(ry
  -march=cpu-type
      Generate instructions for the machine type 
      cpu-type.
      The choices for cpu-type are the same as 
      for -mcpu. Moreover, specifying -march=cpu-type
      implies -mcpu=cpu-type.

Linux Counterからメールが届いた。

いつ登録したかもう忘れたが、 昨年も一回メールが届いているから、 2年以上は経っている筈だ。
登録情報を公開してもいいんだが、spamが今以上に飛んで来るのも厭なのでやめとく。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。