Sat, 21 Dec 2002 20:12:58 JST / hina.di
powered by tds-1.3.0
<issei@issei.org>
UNIX カーネルの解説書。主として取り上げられているのは System V Release 2 で、部分的に System V Rlease 3, 4.2BSD, 4.3BSD につい ても言及されている。
古い書籍ですが、まだ UNIX カーネルが比較的単純だった時代の解説ということ もあり、学習用には良いとの定評あり。今まで読む機会がなかったので、書店で 見つけたのを機に購入。
以前に 日記に書いた malloc した領域の利用状況を追跡するツール xmalloc に関して、ユーザの方 から質問のメールを受け取る。ユーザがいたとは、びっくりだね(ぉぃ
手元では、その後もちょっとした機会に xmalloc を使っていて、機能が多少追 加されてます。公開する予定はなかったのですが、ユーザが約一名いることが確 認されたので置いときましょう。 ドキュメントは書いてないので、使い方は Makefile, test.c と xmalloc.dat を参照して下さい。
New Features
以前も書きましたが Debugging Tools for Dynamic Storage Allocation and Memory Management にリストがあります。 売り物では Rational Software の Purify が有名ですね。
フリーで公開されているツールで、コードを読んで面白いと思ったのは Electric Fence。
これは OS の仮想記憶システムを利用して、malloc() で割り当てるメモリ領域 の直後にアクセス禁止のページを作ります *1。 プログラム中でバッファオーバーランが発生すると、即座に SIGSEGV もしくは SIGBUS シグナルがプロセスに送られるため、確実にオーバーランを補足できま す *2。
副作用として、最低メモリ割り当てサイズがページサイズの 2 倍になりますか ら常時使うわけにはいきませんが、バッファオーバーランが発生した場合に、原 因を突き止めるには有効そうです。
関数の呼び出し履歴を辿る機能。 関数のリターンアドレスを取得する方法は分かってますが、アドレスから関数シ ンボルを復元する (ある程度) 汎用的な方法と、履歴を表示するユーザインター フェースが思いつかないので実装してません。
シンボルの復元は、結局は個別に対処するしかないのかな。ELF を採用している アーキテクチャに関しては、オブジェクトコードを解析する部分は共通に書けそ うだし、objdump (1) や dumpbin などの外部ツールに頼っても良いのかも。
ユーザインターフェースの方は、いったん状態をファイルに書き出しておいて、 後で対話的に解析結果を表示できるように作った方が良いんでしょうね。でも、 対話的なユーザインターフェースを真面目に作るのって面倒なんだよな。
……困ったときは VB でデッチあげ? (← それ UNIX じゃ動かないって)
具体的に列挙しようとすると、意外に分からず。周囲の人に意見を聞いてみると、 「西洋人が言い始めたことだろうから」ということで次の名前が挙がる。
ここで日本海とか言い出す人間がいないあたりは、アレだ :-)
調べてみたところ、現在と大航海時代以前では話が違うが、一般的には次のもの 指して七つの海と呼ぶとのこと。
現在
大航海時代以前
中世以前は、カスピ海も海として扱われていたのですね。またアドリア海をカウ ントしてエーゲ海をカウントしない理由は不明ですが、古代からの海の民族ギリ シア人にとっては、エーゲ海は庭扱いだったのかな?
これは古代インド神話の世界観(世界は七つの大陸を巡る七つの海からなる)や、 古代メソポタミアで「7」に「全て、たくさん」という意味があったことに由来 するらしい、とのこと。
なるほどね。
Pentium III 500MHz の載った Windows NT 4.0 マシンが御機嫌ななめ。前触れ なく NT Explorer が死んだり、シャットダウン時に正常終了しないプロセスが あったりで、そろそろ再インストールの時期らしい。
どうせ再インストールするならってことで、このマシンを FreeBSD 5.0-CURRENT と Windows のデュアルブートに仕立てて、 SSE 対応作業用に使うことにする。
current.jp.freebsd.org から 5.0-CURRENT-20010225-JPSNAP の floppies, bin のみ持ってきて bootable CD-RW を作ってインストール。 mkisofs のコマンドラインオプションを忘れていたのと、Windows 用の CD-R/RW Recording Software, B's Recorder Gold を使って CD-ROM イメージか ら CD-R/W を作成する方法 *1が分からず三分間ほど悩んだ以外は、つつがなく完了。
シングルユーザモードで再起動して / パーティションで softupdates を有効に して、マルチユーザモードに移行。直後
# mkdir /home
と実行した瞬間に panic する。その後も shutdown するときにディスクの sync に失敗したり、どうも不安定。CURRENT っぽくて嬉しいというべきか。
ソースファイル一式を入れるため、port から cvsup-bin をインストールし、 ローカルネットワークの cvsup サーバから最新のソースファイル一式を取り出 す。そのソースを使って kernel とユーザランドを全て作り直し。 shutdown すると再び sync に失敗し、大量のファイルが lost+found 送りに。 ……もしかして、もう一回インストールし直し?
幸い起動した後はまともに動いているようなので、このまま使ってしまおう。 重要なファイルが壊れていると嫌なので、念のため、今夜もう一度 make buildworld しておくか。
ホームディレクトリはネットワーク上のファイルサーバに置いてあるので、日常 生活に必要なアプリケーションだけインストール。
ちょうど Mozilla 0.8 がリリースされたようなので、これも入れてみる。 フォント設定を変更すると SIGSEGV。ウィンドウを複数開いて作業すると、 かなりの確率で SIGSEGV。まだまだβ版だね。 危険な操作を回避して、宥めつすかしつ使えば、使えないこともないか。 しかし Internet Explorer 4.x/5.x for FreeBSD が欲しいねぇ(←……
ウィンドウマネージャは afterstep-i18n。久しぶりに使ってみたら、これも終 了時に SIGSEGV で死ぬなぁ。普段は落ちないから良いんだけど、あとでコード 見ておこう。
ジュリエットの卵は、以前から探していたものの、見つけられなかった作品。 最近は、入手しにくい古めの少女マンガが次々と文庫化されており、嬉しい限り。
しかし、最近、私が読むマンガって、微妙に兄妹もの *1が多い?
そういや、先日、新潮社の「フォーサイト」も届いてました。 まだ開けてない。
Windows NT 4.0 を消した都合上 MS-IME97 使えなくなってしまったので、 Wnn6 を久しぶりに使ってみたら、キーバインドはともかく、どうも変換効率が 悪くて *1使い辛い。
似て非なる道具を使うからストレス溜まるんだよな、ということで、いっそのこ とSKKにしてしまう。
エントリモデルでも 500MHz の Ultra SPARC IIe 載っていて $1000? そりゃ 買いでしょ。
fj.comp.lang.c で出ていた話。C99 の規格書 ANSI/ISO/IEC 9899-1999 の値段。
| 機関名 | フォーマット | 価格 |
|---|---|---|
| ISO |
PDF |
334 スイスフラン (約 23,000 円) |
| 日本規格協会 |
製本 |
20,000 円強 (伝聞) |
| ANSI |
PDF |
$18.00 |
ISO, JSA の値段だと個人で買うのは躊躇するけど、ANSI の価格なら即買いだ よ。$18.00 の規格書がサブセットじゃないか調べて、もし問題なければ購入だ ね。
日本も IT 立国 (って、既に手垢まみれの単語だけど) を目指すというのなら、 邦訳した C99 の規格書を ANSI 並みの価格で配布して欲しい。その方面には予 算がつかないのか?
FreeBSD-users-jp ML で出ていた double 型の自動変数が 8 バイト単位でアラ イメントされない (ことがある) という話。
最近の GCC のドキュメントを見ると、次のように書いてある (IA-32 プロセッ サ限定のコマンドラインオプション)。
`-mpreferred-stack-boundary=NUM'
Attempt to keep the stack boundary aligned to a 2 raised to NUM byte boundary. If `-mpreferred-stack-boundary' is not specified, the default is 4 (16 bytes or 128 bits).
The stack is required to be aligned on a 4 byte boundary. On Pentium and PentiumPro, `double' and `long double' values should be aligned to an 8 byte boundary (see `-malign-double') or suffer significant run time performance penalties. (後略)
簡単に意訳。
`-mpreferred-stack-boundary=NUM'
スタック境界を 2 の n 乗バイト境界に保とうとする。もし指定がなければ、 デフォルト値は 4 (16 バイト = 128 ビット)。
スタックは 4 バイト境界にアライメントされていなればならない。Pentim, Pentium Pro プロセッサでは、`double' と `long double' は 8 バイト境界に アライメントされていた方が良い (-malign-double オプション参照)。8 バイト 境界にアライメントされていない場合、実行時の性能に重大なペナルティが課せ られる。
ドキュメントには、GCC はデフォルトでは 16 バイト境界でアライメントすると 記述されているにも関わらず、実際に試してみると 4 バイト境界でアライメン トされている。
SSE 命令でもアライメントが問題になるため調べていたのですが、どうもアセ ンブラ出力を見る限り、
ということらしい。
アドホックですが 8 バイト境界でアライメントするコードを示しておきます。 main() の最初に一行追加するだけ。
#define STACK_ALIGN (8)
int
main(int argc, char **argv)
{
// 次の一行を追加
__asm__("andl %0,%%esp" :: "i"(~(STACK_ALIGN - 1)));
// 以下、通常の main() 関数の内容
}
こうしても main() 内のローカル変数は 8 バイト境界でアライメントされ ません ので注意。 main() から呼び出した別の関数では、double 型のローカル変数が 8 バイト境 界でアライメントされてるハズです。
( 続き)
何だろうね。 スタートアップルーチンを書き換えて 8 バイト境界でアライメントさせるか、 それとも GCC がスタックトップからの「差」を見てアライメントを合わせてい るのを直すか。
GCC が andl を使ってアライメントを調整せずに、コンパイル時に分かる「差」 を使ってる理由がありそうな気はする。スタックポインタ相対でメモリアクセス するコードとかあると、過去のコードと互換性がなくなるからかなぁ。
私は gcc は開発関係のメーリングリストを読んでないので、このあたりのコー ドが実装された経緯は良く分からず。詳しい人が FreeBSD-users-jp ML あたり でリプライしてくれるのを期待しましょう。
別のことやってたら、あまり進まなかったよ。。。
FreeBSD 4.0-RELEASE 用に作った SSE 対応パッチを FreeBSD-CURRENT にマージ する。使う道具は、CVS のコマンドラインオプション -j。
% cvs -R -d /d0/Archive/FreeBSD-CVS export -rHEAD src/sys
% cvs import -m "FreeBSD 5.0-CURRENT (20010228)" FreeBSD/sys FreeBSD r500_20010228
% cvs co -jr400_release -jr500_20010228 FreeBSD/sys
これでカレントディレクトリの下に FreeBSD/sys ディレクトリが作成され、 そこにマージした結果がチェックアウトされる。
マージに失敗した部分は、そのファイルのあるディレクトリに #.XXXという名前で置いてある。
マージに成功したファイルは、元のファイルが #.XXXという名前で置いてある。 失敗した部分は、オリジナルと変更分が <<<<<、 >>>>> で括られてファイル中 に記録される。
% find . -name '.#*' | wc -l 12
ありゃ、12個もマージ失敗してるのか。
この先は CVS には任せられないので、順に見ていくしかない。で、途中までマー ジして時間切れ。
検索エンジン経由でこのページに来る人は、たいてい UNIX やプログラミング関 係、もしくは少女マンガのキーワードで検索してますが (たまに経済関係とか、 古典文学とかもあるけど少なめ)、最近は私の名前をキーに検索してる人も、ち らほら。
うーむ、最近は「鈴木一生」の名前が入った名刺は配ってないし、ネットワーク 上では基本的に Issei.- もしくは Issei Suzuki としか名乗ってないんだけど、 どこから見つけてくるのやら。
同姓同名の人を探してる?