或曰

……と、ある人は言った。

-- 2001年2月下旬 --

Sat, 21 Dec 2002 20:12:58 JST / hina.di
powered by tds-1.3.0
<issei@issei.org>



検索式: [検索方法]

表示件数: 表示形式: ソート:

[最新版] << == >> [一覧]

2001/2/20(Tue)

[Book] 書籍購入

UNIX カーネルの解説書。主として取り上げられているのは System V Release 2 で、部分的に System V Rlease 3, 4.2BSD, 4.3BSD につい ても言及されている。

古い書籍ですが、まだ UNIX カーネルが比較的単純だった時代の解説ということ もあり、学習用には良いとの定評あり。今まで読む機会がなかったので、書店で 見つけたのを機に購入。


2001/2/21(Wed)

xmalloc

以前に 日記に書いた malloc した領域の利用状況を追跡するツール xmalloc に関して、ユーザの方 から質問のメールを受け取る。ユーザがいたとは、びっくりだね(ぉぃ

手元では、その後もちょっとした機会に xmalloc を使っていて、機能が多少追 加されてます。公開する予定はなかったのですが、ユーザが約一名いることが確 認されたので置いときましょう。 ドキュメントは書いてないので、使い方は Makefile, test.c と xmalloc.dat を参照して下さい。

New Features

_ その他のデバッグ機能つき malloc ライブラリ

以前も書きましたが Debugging Tools for Dynamic Storage Allocation and Memory Management にリストがあります。 売り物では Rational SoftwarePurify が有名ですね。

フリーで公開されているツールで、コードを読んで面白いと思ったのは Electric Fence。

これは OS の仮想記憶システムを利用して、malloc() で割り当てるメモリ領域 の直後にアクセス禁止のページを作ります *1。 プログラム中でバッファオーバーランが発生すると、即座に SIGSEGV もしくは SIGBUS シグナルがプロセスに送られるため、確実にオーバーランを補足できま す *2

副作用として、最低メモリ割り当てサイズがページサイズの 2 倍になりますか ら常時使うわけにはいきませんが、バッファオーバーランが発生した場合に、原 因を突き止めるには有効そうです。

_ 個人的に xmalloc に欲しいのは

関数の呼び出し履歴を辿る機能。 関数のリターンアドレスを取得する方法は分かってますが、アドレスから関数シ ンボルを復元する (ある程度) 汎用的な方法と、履歴を表示するユーザインター フェースが思いつかないので実装してません。

シンボルの復元は、結局は個別に対処するしかないのかな。ELF を採用している アーキテクチャに関しては、オブジェクトコードを解析する部分は共通に書けそ うだし、objdump (1) や dumpbin などの外部ツールに頼っても良いのかも。

ユーザインターフェースの方は、いったん状態をファイルに書き出しておいて、 後で対話的に解析結果を表示できるように作った方が良いんでしょうね。でも、 対話的なユーザインターフェースを真面目に作るのって面倒なんだよな。

……困ったときは VB でデッチあげ? (← それ UNIX じゃ動かないって)


*1:システムコールとしては mmap (2), mprotect (2) などを利用。
*2:対して xmalloc のアプローチでは、realloc, free, xassert 呼び出し時にのみ オーバーランを検出できます。事後にオーバーランが発生していたことは分かっ ても、いつ、どこでオーバーランしたのかは分かりません。


2001/2/22(Thu)

七つの海

具体的に列挙しようとすると、意外に分からず。周囲の人に意見を聞いてみると、 「西洋人が言い始めたことだろうから」ということで次の名前が挙がる。

ここで日本海とか言い出す人間がいないあたりは、アレだ :-)

調べてみたところ、現在と大航海時代以前では話が違うが、一般的には次のもの 指して七つの海と呼ぶとのこと。

現在

大航海時代以前

中世以前は、カスピ海も海として扱われていたのですね。またアドリア海をカウ ントしてエーゲ海をカウントしない理由は不明ですが、古代からの海の民族ギリ シア人にとっては、エーゲ海は庭扱いだったのかな?

_ なぜ全世界の海を「七つの海」と呼ぶ?

これは古代インド神話の世界観(世界は七つの大陸を巡る七つの海からなる)や、 古代メソポタミアで「7」に「全て、たくさん」という意味があったことに由来 するらしい、とのこと。

なるほどね。

unsubscribe


2001/2/27(Tue)

FreeBSD 5.0-CURRENT マシンを作る

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:mkisofs で作成する iso9660 イメージファイル名を *.img として、B's Recorder Gold メインウィンドウ下段のトラックウェルに drag & drop する。

お買いもの

_[Book] 書籍

_[Comic] コミック

ジュリエットの卵は、以前から探していたものの、見つけられなかった作品。 最近は、入手しにくい古めの少女マンガが次々と文庫化されており、嬉しい限り。

しかし、最近、私が読むマンガって、微妙に兄妹もの *1が多い?

_ 雑誌

そういや、先日、新潮社の「フォーサイト」も届いてました。 まだ開けてない。


*1:間に×は入りません。


2001/2/28(Wed)

日本語入力

Windows NT 4.0 を消した都合上 MS-IME97 使えなくなってしまったので、 Wnn6 を久しぶりに使ってみたら、キーバインドはともかく、どうも変換効率が 悪くて *1使い辛い。

似て非なる道具を使うからストレス溜まるんだよな、ということで、いっそのこ とSKKにしてしまう。


*1:辞書登録してないせいもあるかも。

Sun Blade 100

エントリモデルでも 500MHz の Ultra SPARC IIe 載っていて $1000? そりゃ 買いでしょ。

C99 Specification

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 並みの価格で配布して欲しい。その方面には予 算がつかないのか?

GCC スタック変数のアライメント

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 命令でもアライメントが問題になるため調べていたのですが、どうもアセ ンブラ出力を見る限り、

  1. GCC では関数呼び出し時に、現在のスタックフレームとスタックポインタ値の「差」がアライメント値に一致するように調整している。「差」しか見ていな いため、一旦アライメントがズレると、そのままになってしまう。
  2. 現在の FreeBSD では main() 関数が呼ばれる前の段階でスタックのアライメントを 4 バイト境界で行なっているめ、その後も連鎖的に 4 バイト境界でアラ イメントされてしまう。

ということらしい。

アドホックですが 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 de SSE の話

別のことやってたら、あまり進まなかったよ。。。

FreeBSD 4.0-RELEASE 用に作った SSE 対応パッチを FreeBSD-CURRENT にマージ する。使う道具は、CVS のコマンドラインオプション -j。

  1. /d0/Archive/FreeBSD-CVS に置いてある FreeBSD の CVS リポジトリから、FreeBSD 5.0-CURRENT のソースコードを取り出す
    % cvs -R -d /d0/Archive/FreeBSD-CVS export -rHEAD src/sys
    
  2. FreeBSD/sys にあるローカル CVS リポジトリに FreeBSD 5.0-CURRENT のソースコードをベンダーブランチとして取り込む
    % cvs import -m "FreeBSD 5.0-CURRENT (20010228)" FreeBSD/sys FreeBSD r500_20010228
    
  3. FreeBSD 4.0-RELEASE (事前に r400_release というタグ名でローカル CVS リポジトリに登録済み) と FreeBSD 4.0-RELEASE + SSE 対応の差分を FreeBSD 5.0-CURRENT のコードにマージ。
    % cvs co -jr400_release -jr500_20010228 FreeBSD/sys
    

これでカレントディレクトリの下に FreeBSD/sys ディレクトリが作成され、 そこにマージした結果がチェックアウトされる。

マージに失敗した部分は、そのファイルのあるディレクトリに #.XXXという名前で置いてある。

マージに成功したファイルは、元のファイルが #.XXXという名前で置いてある。 失敗した部分は、オリジナルと変更分が <<<<<、 >>>>> で括られてファイル中 に記録される。

% find . -name '.#*' | wc -l
   12

ありゃ、12個もマージ失敗してるのか。

この先は CVS には任せられないので、順に見ていくしかない。で、途中までマー ジして時間切れ。

検索くん

検索エンジン経由でこのページに来る人は、たいてい UNIX やプログラミング関 係、もしくは少女マンガのキーワードで検索してますが (たまに経済関係とか、 古典文学とかもあるけど少なめ)、最近は私の名前をキーに検索してる人も、ち らほら。

うーむ、最近は「鈴木一生」の名前が入った名刺は配ってないし、ネットワーク 上では基本的に Issei.- もしくは Issei Suzuki としか名乗ってないんだけど、 どこから見つけてくるのやら。

同姓同名の人を探してる?


以上、5日分です。

[最新版] [一覧] << == >>

Copyright © 2000 - 2001
Issei Suzuki <issei@issei.org>